如何在Python中检查键是否存在于值中以及键中的值

时间:2018-10-24 17:58:33

标签: python loops dictionary iteration

我需要遍历字典的帮助。这可能不是很聪明的方法,但是我需要尝试。

我有一个这样的字典:

{'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})

但是这只重复了一次,我不知道如何重新遍历直到断链。

编辑: enter image description here

1 个答案:

答案 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

并以相同的方式调用此函数。