在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中过滤字典的最佳方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python中按值删除字典项的最佳方法是啥? [复制]

字典的过滤值[重复]

在 Python 中从 JSON 数据创建列表和字典 [重复]

在python中过滤字典? [复制]

python字典列表过滤器

python字典列表过滤器