检查字典中是否有任何值符合条件

22

Python程序员如何检查字典中的任何值是否符合某个条件(在我的情况下是大于0)。我正在寻找最具“Python风格”的方式,对性能影响最小。

我的字典:

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

你是只检查字典中的一个条目(如你的文本所说)还是所有条目(如你的代码所做的)? - smcg
@smcg:抱歉我的英语不好,我是指所有的条目;] - Firebowl2000
字典的.values是一个序列; any接受一个序列; 因此我们可以使用与链接的重复内容相同的技术(这也是给定答案的地方)。 - Karl Knechtel
2个回答

34
你可以使用 any[文档]:
>>> 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[文档]

>>> all(v > 0 for v in pairs.itervalues())
False
>>> all(v < 3000 for v in pairs.itervalues())
True

由于您正在使用Python 2.7,.itervalues() 可能比 .values() 更好一些,因为它不会创建一个新的列表。


1
我甚至可以说这是做这件事的“Pythonic”方式。 - Lukas Graf
我经常想知道.values.itervalues之间到底有多大的区别--毕竟,你并没有创建新的对象,只是新的引用...我想这值得问一下Python引用实际上占用了多少内存...(我通常只使用values,因为当我将代码移动到py3k时它不需要更改...但也许我不应该这样做...)好答案。这绝对是解决这个问题的方法(+1)。 - mgilson
@mgilson:是的,我倾向于自己编写.values(),除非我有一些原因想要获得性能提升(我通常只看到几十个百分点)或字典真的很大。但每当我不使用它时,总会有人评论它,所以你赢不了。;-) - DSM
另请参见PIE802 - Matthias Arras

1
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接