20

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
4

2 回答 2

32

您可以使用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()它不创建新列表要好一些。

于 2012-09-11T18:58:13.060 回答
0
Python 3.x Update

在 Python 3 中,对映射的直接迭代与在 Python 2 中的工作方式相同。没有基于方法的等价物 - Python 3 中 d.itervalues() 和 d.iteritems() 的语义等价物是 iter(d.values ()) 和 iter(d.items())。

根据文档,您应该使用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
于 2021-04-13T00:15:00.040 回答