【问题标题】:Check if any value of a dictionary matches a condition检查字典的任何值是否与条件匹配
【发布时间】:2012-09-11 18:51:00
【问题描述】:

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

【问题讨论】:

  • 您是只检查字典中的一个条目(如您的文本所说)还是所有条目(如您的代码所做的那样)?
  • @smcg:对不起我的英语。我的意思是所有条目;]

标签: python python-2.7


【解决方案1】:

你可以使用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() 好一点,因为它不会创建新列表。

【讨论】:

  • 感谢帝斯曼!这非常有用。
  • 我会说这是 the pythonic 方式。
  • 我经常想知道.values.itervalues 之间到底有多大区别——毕竟,你不是在创建新对象,只是在创建新引用......我想值得问一下如何python引用实际上占用了很多内存......(我通常只使用values,因为当我将代码移动到py3k时不需要更改它......但也许我不应该......)很好的答案.这绝对是解决这个问题的方法(+1)
  • @mgilson:是的,我倾向于自己写.values(),除非我有理由想要性能提升(我通常只看到百分之十)或者字典真的很大。但是每当我不使用它时,就会有人在上面使用它,因此您无法获胜。 ;-)
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 2021-07-31
    • 2010-12-08
    • 1970-01-01
    • 2020-09-10
    • 2022-07-12
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多