首页 > 解决方案 > 如何检查键是否存在于Python中的值和键中的值中

问题描述

我需要帮助来遍历字典。这可能不是那么聪明的做法,但我需要尝试。

我有一个这样的字典:

{'a': 'b', 
 'b': 'c', 
 'c': 'd', 
 'm':'n', 
 'p':'r', 
 'r': 't'}

我需要什么作为输出,它可以是字典或数据框:

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

但这只是迭代一次,我不知道如何重新迭代,直到链条断裂。

编辑: 在此处输入图像描述

标签: pythonloopsdictionaryiteration

解决方案


定义一个小函数(比如,get_key)来递归遍历你的字典(比如,oct)一个yield一个键:

def get_key(dct, key):
    while key in dct:
        key = dct[key]
        yield key

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

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


推荐阅读