gpt4 book ai didi

Python,使用 .itervalues() 检查字典中的值会返回不同的比较结果

转载 作者:太空宇宙 更新时间:2023-11-04 02:39:09 26 4
gpt4 key购买 nike

为什么 Comparison #1 和 Comparison #2 的评估结果不同?

list = [{'objItem':{'key':'exists', 'a':'aaa', 'b':'bbb', 'c':'ccc', 'd':'ddd'}}]
valA = "aaa"
valB = "bbb"
valC = "ccc"


#Comaprisson 1
if valC in list[0]['objItem'].itervalues() and valA in list[0]['objItem'].itervalues() and valB in list[0]['objItem'].itervalues():
print "True #1"
else:
print "False #1"

#Comparisson 2
values = list[0]['objItem'].itervalues()
if valC in values and valA in values and valB in values:
print "True #2"
else:
print "False #2"

结果:

$python main.py
True #1
False #2

谢谢

最佳答案

Itervalues(如 python-reference 所示)给出了一个迭代器而不是映射的值列表。如果使用 python 3,获取值集合的正确方法是通过 values()。ref对于 python 2,正确的方法是按照这个例子把它当作 list(list[0]['objItem'].itervalues())。

至于为什么两者返回不同的结果:
正如前面提到的用户 0TTT0,
当您使用 values 方法时,迭代器会耗尽它的值。
但如果你尝试过

valC in list[0]['objItem'].itervalues()

再次在您的代码片段之后,它将返回 true。
这是因为 list[0]['objItem'].itervalues() 每次都会返回一个新的迭代器对象。但另一方面,values 有一个存储的迭代器对象。
所以:values 中的 valC 会消耗值运算符中的“ccc”,但 list[0]['objItem'].itervalues() 中的 valC 每次都会消耗一个新的迭代器“ccc”!

旁注:
我建议将列表用作变量。
1. 因为将变量命名为与对象类型相同的做法是不好的做法。
2. 你可以给它起一个更具描述性和复数性的名字

关于Python,使用 .itervalues() 检查字典中的值会返回不同的比较结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47047675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com