选择Python字典中大于特定值的元素

41

我需要从一个字典中选择某个值或更大的元素。我知道如何在列表中实现这一点,Return list of items in list greater than some value

但我不确定如何将其转化为字典可用的函数。我设法获得与数字大于或等于某个值相对应的标签(我想是这样),但是使用以下代码只会输出这些标签:

[i for i in dict if dict.values() >= x]
3个回答

55

.items()会返回一组(key, value)对,你可以使用它们来重构一个过滤后的dict。使用列表推导式生成此dict所需的可迭代对象,并将其传递给dict()构造函数,该函数接受一个(key, value)元组的可迭代对象,即我们的列表推导式:

>>> d = dict(a=1, b=10, c=30, d=2)
>>> d
{'a': 1, 'c': 30, 'b': 10, 'd': 2}
>>> d = dict((k, v) for k, v in d.items() if v >= 10)
>>> d
{'c': 30, 'b': 10}

如果您不关心在 Python 2.7 版本之前运行代码,可以查看 @opatut答案,使用"字典推导式"

{k:v for (k,v) in dict.items() if v > something}

2
太好了!你能像我是五岁一样解释一下这个语法实际上是如何工作的吗? - Jesse O
@JesseO 我刚刚添加了足够的解释和足够的文档链接,以便你要么理解它(如果你对Python有一定的流利度),要么可以自己解决问题。 - nmaier

22

尽管nmaier的解决方案是我会采用的方法,但请注意自Python2.7+以来就有了"字典推导"语法:

{k:v for (k,v) in dict.items() if v > something}

在这里找到:用Python中的列表推导式创建字典。我通过谷歌搜索“python dictionary list comprehension”找到了这个顶部帖子。

说明

  • { .... } 包含字典推导式
  • k:v 表示要添加到字典中的元素
  • for (k,v) in dict.items() 这会遍历字典的所有元组(键-值对)
  • if v > something 这是必须应用于每个要包括的值的条件

我猜我还是“老派”的吧。 :D - nmaier
是啊,我也是。我刚学会那个语法。其实挺不错的。 - opatut
我自己每隔几周就会重新学习那些新的语法:p - nmaier
dict.iteritems() 会稍微好一些。 - fearphage
我在想,如果迭代一个有几百万个元素的字典,这会有多快? - guy

9
你需要使用 dict[i] 而不是 dict.values()dict.values() 将返回字典中所有值的列表。
dict = {2:5, 6:2}
x = 4
print [dict[i] for i in dict if dict[i] >= x] # prints [5]

很好,正是我所需要的。 - James MV

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