Объединение ключевых значений в словаре
У меня есть словарь, состоящий из 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])
Я могу сделать еще одно условное выражение, чтобы добавить следующий уровень, но это было бы неправильным способом. Я не очень хорошо знаком со словарями, так что будет лучше?
Ответы
Ответ 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']}