合并字典中的键值对

use*_*663 20 python algorithm dictionary

我有一个由员工经理作为键值对的字典:

{'a': 'b', 'b': 'd', 'c': 'd', 'd': 'f'}
Run Code Online (Sandbox Code Playgroud)

我想用字典来展示各级员工经理(员工的老板,老板的老板,老板老板的老板等)之间的关系.所需的输出是:

{'a': [b,d,f], 'b': [d,f], 'c': [d,f], 'd': [f] }
Run Code Online (Sandbox Code Playgroud)

这是我的尝试,只显示第一级:

for key, value in data.items():
    if (value in data.keys()):
        data[key] = [value]
        data[key].append(data[value])
Run Code Online (Sandbox Code Playgroud)

我可以做另一个条件语句来添加下一个级别,但这是错误的方法.我对字典不太熟悉,那么什么是更好的方法呢?

Joh*_*ooy 11

>>> 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']}
Run Code Online (Sandbox Code Playgroud)


Zda*_*daR 7

您可以使用递归的概念:

def get_linked_list(element, hierarchy, lst):
    if element:
        lst.append(element)
        return get_linked_list(hierarchy.get(element, ""), hierarchy, lst)
    else:
        return lst
Run Code Online (Sandbox Code Playgroud)

然后访问层次结构:

>>> 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']}
Run Code Online (Sandbox Code Playgroud)

但是必须小心,因为如果我们在字典中有一个项目,这可能会进入无限循环 "a": "a"