如何知道某个值是否在嵌套字典中?

时间:2018-06-29 15:04:56

标签: python python-3.x dictionary

我是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")

但是这给了我一个KeyError,值为'0'。我已经搜索了类似的问题,但是没有找到可以用来解决我的问题的问题。你能帮我么?预先感谢。

5 个答案:

答案 0 :(得分:7)

您可以使用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())

答案 1 :(得分:3)

您可以将any与生成器理解一起使用,{@ 3jax1234的as suggested

或者,如果重复执行此操作,则可以计算值的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

答案 2 :(得分:0)

首先从您尝试过的内容开始,您确实可以:

  • 使用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循环和==操作,
  • 并使用any通过更智能的Python内置函数替换ifbreak语句。

这段较短的代码实际上将以一种真正的pythonic方式与上一个完全相同:

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

享受!

答案 3 :(得分:0)

您正在将字典视为列表。您无法像这样索引字典:

dic[0]

但是您可以从给定的键中获取值,就像这样:

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

这样,如下修改您的for循环:

for i in dic:
    ...

答案 4 :(得分:0)

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

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