【问题标题】:How to check if key exist in values and values in key in Python如何检查键是否存在于Python中的值和键中的值中
【发布时间】:2019-03-29 05:47:38
【问题描述】:

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

我有一个这样的字典:

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

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

编辑:

【问题讨论】:

  • 字典不是按顺序排列的。您期望的输出假定在迭代时看到项目的特定顺序。
  • @Abhishek 从数据框中这样做更好吗?我从 df 中的两列创建了这本字典
  • 这是一个图遍历问题。 dict 不是一个很好的代表,尽管它并不可怕。但是,您可以使用 graph 包。至少查找“Python 图”和通用图遍历算法,为您提供所需的工具。

标签: python loops dictionary iteration


【解决方案1】:

定义一个小函数(例如,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

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

【讨论】:

  • 谢谢。但我收到 TypeError: unhashable type: 'list' for line visitor.add(key)
  • @jovicbg dct 的值中有列表吗?这将不起作用,因为您的问题并未表明它必须处理输入中的这些类型的值。
  • 不,它没有在输入中列出,只有数据帧中的两列,字符串转换为 dict 作为键:值对。
  • @jovicbg 无论您需要做什么,请确保您的输入完全如问题中所述。或者,弄清楚该怎么做......或者如果你做不到,请提出一个问题。
  • 我已经编辑了我的问题,添加了截图。从问题中粘贴 dict 并运行,现在有空列表。感谢您的帮助。
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2019-12-20
相关资源
最近更新 更多