我是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'。我已经搜索了类似的问题,但是没有找到可以用来解决我的问题的问题。你能帮我么?预先感谢。
答案 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")
要走得更远,您还可以:
for
循环和==
操作,any
通过更智能的Python内置函数替换if
和break
语句。这段较短的代码实际上将以一种真正的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")