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

时间:2017-11-01 03:13:40

标签: python dictionary

为什么比较#1和比较#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

谢谢

2 个答案:

答案 0 :(得分:1)

itervalues()返回一个迭代器时,在比较期间它将通过迭代器运行,直到它找到值或熄灭迭代器。在您的情况下,您检查了valC这是迭代器中可用的最后一个值,因此当它检查比较中的下一个值valB时,没有什么可以检查的。相反,如果你写了if valA in values and valB in values and valC in values:,那么将返回一个真值。

答案 1 :(得分:1)

Itervalues(在python-reference上看到)给出了一个迭代器,而不是一个map的值列表。 如果使用python 3,获取值集合的正确方法将是values()ref 对于python 2, 正确的方法是将它作为列表(list [0] ['objItem']。itervalues())按照这个例子。

至于为什么两人会得出不同的结果:
正如前面提到的用户0TTT0,
使用values方法时,迭代器会耗尽其值 但如果你试过

  列表[0] ['objItem']中的

valC。itervalues()

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

旁注:
我建议使用list作为变量。
1.因为命名变量与对象类型相同是不好的做法 你可以把它命名为更具描述性和复数的东西