python程序员如何检查字典的任何值是否与条件匹配(在我的情况下大于0
)。我正在寻找性能影响最小的“pythonic”方式。
我的字典:
pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 }
到目前为止,我使用过这两种(怪异的?)方法。
1
options = pairs.values() # extract values
for i in options:
if i > 0:
return True
return False
2
options = sorted(pairs.items(), key=lambda e: e[1], reverse=True) # rank from max to min
if options[0][1] > 0:
return True
else:
return False
答案 0 :(得分:23)
您可以使用any
[docs]:
>>> pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 }
>>> any(v > 0 for v in pairs.itervalues())
True
>>> any(v > 3000 for v in pairs.itervalues())
False
另请参阅all
[docs]:
>>> all(v > 0 for v in pairs.itervalues())
False
>>> all(v < 3000 for v in pairs.itervalues())
True
由于您使用的是Python 2.7,.itervalues()
可能比.values()
略好,因为它不会创建新列表。
答案 1 :(得分:0)
Python 3.x Update
<块引用>
在 Python 3 中,映射上的直接迭代与在 Python 2 中的工作方式相同。没有基于方法的等价物 - Python 3 中 d.itervalues() 和 d.iteritems() 的语义等价物是 iter( d.values()) 和 iter(d.items()).
根据docs,您应该使用iter(d.values())
,而不是d.itervalues()
:
>>> pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 }
>>> any(v > 0 for v in iter(pairs.values()))
True
>>> any(v > 3000 for v in iter(pairs.values()))
False