在Python中过滤字典的最佳方法[重复]
Posted
技术标签:
【中文标题】在Python中过滤字典的最佳方法[重复]【英文标题】:The best way to filter a dictionary in Python [duplicate] 【发布时间】:2012-01-15 12:55:42 【问题描述】:我有一个字符串键和浮点值字典。
mydict =
mydict["joe"] = 20
mydict["bill"] = 20.232
mydict["tom"] = 0.0
我想过滤字典以仅包含值大于零的对。
在 C# 中,我会这样做:
dict = dict.Where(r=>r.Value > 0);
Python 中的等价代码是什么?
【问题讨论】:
【参考方案1】:d = dict((k, v) for k, v in d.iteritems() if v > 0)
在 Python 2.7 及更高版本中,有更好的语法:
d = k: v for k, v in d.items() if v > 0
请注意,这并不是严格意义上的过滤器,因为它确实会创建一个新字典。
【讨论】:
如果要按键过滤怎么办? 把它改成测试k
而不是v
?【参考方案2】:
试试
y = filter(lambda x:dict[x] > 0.0,dict.keys())
lambda 是从字典中输入键,并将字典中每个键的值与条件进行比较,返回可接受的键。
【讨论】:
发问者正在寻找返回字典,这只返回字典的键。而且它的效率/Pythonic 比@kindall 的答案低 可能是这样的:d = dict(filter(lambda x: x[1] > 0.0, d.items()))
【参考方案3】:
首先,您不应该使用关键字dict
作为变量名,因为它会污染命名空间,并阻止您在当前或嵌入范围内引用dict
类。
d =
d["joe"] = 20
d["bill"] = 20.232
d["tom"] = 0.0
# create an intermediate generator that is fed into dict constructor
# via a list comprehension
# this is more efficient that the pure "[...]" variant
d2 = dict(((k, v) for (k, v) in d.iteritems() if v > 0))
print d2
# 'bill': 20.232, 'joe': 20
或者,您可以直接在其上创建生成器和迭代器。这更像是一个“过滤器”,因为生成器只引用原始字典中的值,而不是制作子集副本;因此比创建新字典更有效:
filtered = ((k, v) for (k, v) in d.iteritems() if v > 0)
print filtered
# <generator object <genexpr> at 0x034A18F0>
for k, v in filtered:
print k, v
# bill 20.232
# joe 20
【讨论】:
【参考方案4】:foo =
foo["joe"] = 20
foo["bill"] = 20.232
foo["tom"] = 0.0
bar = dict((k,v) for k,v in foo.items() if v>0)
dict
是 Python 中的关键字,所以我将其替换为 foo。
【讨论】:
【参考方案5】:dict
构造函数可以采用一系列 (key,value)
对,而 dict 的 iteritems
方法产生一系列 (key,value)
对。两种美妙的味道在一起味道很好。
newDict = dict([item for item in oldDict.iteritems() if item[1] > 0])
【讨论】:
【参考方案6】:假设您的原始字典是 d1
,您可以使用以下内容:
d2 = dict((k, v) for k, v in d1.items() if v > 0)
顺便注意dict
已经在python中保留了。
【讨论】:
以上是关于在Python中过滤字典的最佳方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章