Подтвердить что ты не робот

Объединение ключевых значений в словаре

У меня есть словарь, состоящий из employee-manager как пары ключ-значение:

{'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'}

Я хочу показать отношения между сотрудником-менеджером на всех уровнях (босс сотрудника, его босс-босс, босс-босс босса и т.д.), используя словарь. Желаемый результат:

{'a': [b,d,f], 'b': [d,f], 'c': [d,f], 'd': [f] }

Вот моя попытка, которая показывает только первый уровень:

for key, value in data.items():
    if (value in data.keys()):
        data[key] = [value]
        data[key].append(data[value])

Я могу сделать еще одно условное выражение, чтобы добавить следующий уровень, но это было бы неправильным способом. Я не очень хорошо знаком со словарями, так что будет лучше?

4b9b3361

Ответ 1

>>> D = {'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'}
>>> res = {}
>>> for k in D:
...     res[k] = [j] = [D[k]]
...     while j in D:
...         j = D[j]
...         res[k].append(j)
... 
>>> res
{'b': ['d', 'f'], 'c': ['d', 'f'], 'd': ['f'], 'a': ['b', 'd', 'f']}

Ответ 2

Вы можете использовать понятие рекурсии как:

def get_linked_list(element, hierarchy, lst):
    if element:
        lst.append(element)
        return get_linked_list(hierarchy.get(element, ""), hierarchy, lst)
    else:
        return lst

И затем войдите в иерархию как:

>>> d = {'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'}   
>>> print {elem:get_linked_list(elem, d, [])[1:] for elem in d.keys()}
>>> {'a': ['b', 'd', 'f'], 'c': ['d', 'f'], 'b': ['d', 'f'], 'd': ['f']}

Однако следует проявлять осторожность, поскольку это может привести к бесконечному циклу, если у нас есть элемент в словаре как "a": "a"

Ответ 3

x={'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'}
d={}
l=x.keys()
for i in l:
    d.setdefault(i,[])
    d[i].append(x[i])
    for j in l[l.index(i)+1:]:
        if j==d[i][-1]:
            d[i].append(x[j])

печать d

Вывод: {'a': ['b', 'd', 'f'], 'c': ['d', 'f'], 'b': ['d', 'f'], 'd': ['f']}