【问题标题】:How to know if a value is inside a nested dictionary?如何知道一个值是否在嵌套字典中?
【发布时间】:2018-06-29 15:04:55
【问题描述】:

我是 Python 新手,仍在学习如何使用。我有以下字典:

dic = {'0': {'text': 'a', 'lang': 'es', 'rating': '4'}, '1': {'text': 'b', 'lang': 'es', 'rating': '3'}, '2': {'text': 'c', 'lang': 'es', 'rating': '1'}, '3': {'text': 'd', 'lang': 'es', 'rating': '2'}, '4': {'text': 'e', 'lang': 'es', 'rating': '5'}}

现在,我想知道文本,例如“a”是否是任何嵌套字典的值(我知道有一个 value() 函数返回字典的值,但是在这种情况下它只会返回第一个字典的值,不是吗?像 0,1,2,3,4)

我试过了

for i in range(len(dic)):
  if text in dic[i].values():
    print("Yes")
  else:
    print("No")

但这给了我一个值为“0”的 KeyError。我搜索了类似的问题,但没有找到任何可以用来解决我的问题的问题。你能帮我么?提前致谢。

【问题讨论】:

  • for i in range(len(dic)) 将遍历整数,直到字典中的键数,这在此处可能有效。但是,您真正想要的是 for k in dic,它将遍历键。

标签: python python-3.x dictionary


【解决方案1】:

你可以使用any:

dic = {'0': {'text': 'a', 'lang': 'es', 'rating': '4'}, '1': {'text': 'b', 'lang': 'es', 'rating': '3'}, '2': {'text': 'c', 'lang': 'es', 'rating': '1'}, '3': {'text': 'd', 'lang': 'es', 'rating': '2'}, '4': {'text': 'e', 'lang': 'es', 'rating': '5'}}
result = any('a' in d.values() for d in dic.values())

【讨论】:

    【解决方案2】:

    从你尝试过的开始,你确实可以:

    • 使用for 循环迭代dic 的值,它们也是字典。
    • 检查每个字典内部的键 'text' 的值是否等于 'a'
    • 如果是,则打印'Yes' 并停止循环。
    • 如果循环结束时没有任何匹配,则打印'No'

    让我们用漂亮的for/else 声明来做到这一点:

    for d in dic.values():
        if d['text'] == 'a':
            print("Yes")
            break
    else:
        print("No")
    


    更进一步,您还可以:

    • 使用推导以更智能的 Python 方式执行 for 循环和 == 操作,
    • 并使用anyifbreak 语句替换为更智能的Python 内置函数。

    这个更短的代码实际上会以一种真正的 Python 方式完成与前一个完全相同的事情:

    if any(d['text'] == 'a' for d in dic.values()):
        print("Yes")
    else:
        print("No")
    

    享受吧!

    【讨论】:

      【解决方案3】:

      您可以将any 与生成器理解一起使用,as suggested by @Ajax1234。

      或者,如果您重复执行此操作,您可以计算 set 的值并检查 O(1) 复杂度的成员资格。 itertool.chain 是组合嵌套值的有用工具:

      from itertools import chain
      
      values = set(chain.from_iterable(i.values() for i in dic.values()))
      
      res = 'a' in values  # True
      

      【讨论】:

        【解决方案4】:

        您将字典视为列表。你不能像这样索引字典:

        dic[0]
        

        但是您可以从给定的键中获取值,如下所示:

        dic["0"] # yields {'text': 'a', 'lang': 'es', 'rating': '4'}
        

        因此,如下修改你的 for 循环:

        for i in dic:
            ...
        

        【讨论】:

          【解决方案5】:

          如果您确定要查找的字符串不会出现在键名中,那么另一个简单的解决方案是将整个 dict 转换为 str 并搜索字符串

          if 'a' in str(dic):
              print("a is there")
          

          【讨论】:

            猜你喜欢
            • 2015-06-02
            • 2018-09-02
            • 1970-01-01
            • 2021-06-13
            • 1970-01-01
            • 2021-02-08
            • 1970-01-01
            • 2021-03-09
            • 2019-01-09
            相关资源
            最近更新 更多