繁体   English   中英

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

[英]How to know if a value is inside a nested 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")

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

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

正如@Ajax1234所建议的,您可以将any与生成器理解一起使用。

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

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

  • 使用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 内置函数。

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

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

享受 !

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

dic[0]

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

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

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

for i in dic:
    ...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM