我需要遍历字典的帮助。这可能不是很聪明的方法,但是我需要尝试。
我有一个这样的字典:
{'a': 'b',
'b': 'c',
'c': 'd',
'm':'n',
'p':'r',
'r': 't'}
我需要作为输出,它可以是dict或dataframe:
'a' : ['b', 'c', 'd'],
'b' : ['c', 'd'],
'c': ['d'],
'm': ['n'],
'p': ['r', 't'],
'r': ['t']
我尝试过:
dict_output = {}
for k, v in my_dict.items():
lista = []
for ki, va in my_dict.items():
if v in ki:
lista.append(va)
dict_l.update({k:lista})
但是这只重复了一次,我不知道如何重新遍历直到断链。
答案 0 :(得分:2)
定义一个小函数(例如get_key
)来递归遍历字典(例如oct)
和yield
键:
def get_key(dct, key):
while key in dct:
key = dct[key]
yield key
现在,通过在dict理解内调用get_key
来构建新词典。
{k : list(get_key(dct, k)) for k in dct}
{'a': ['b', 'c', 'd'],
'b': ['c', 'd'],
'c': ['d'],
'm': ['n'],
'p': ['r', 't'],
'r': ['t']}
处理周期
请注意,如果您的“图形”具有循环(a:b和b:a),则此操作不会终止。您可以通过维护一组visited
节点来解决此问题:
def get_key_handle_cycles(dct, key):
visited = set()
while key in dct and key not in visited:
visited.add(key)
key = dct[key]
yield key
并以相同的方式调用此函数。