Python中过滤字典的最佳方法

18

我有一个字符串键和浮点数值的字典。

 mydict = {}
 mydict["joe"] = 20
 mydict["bill"] = 20.232
 mydict["tom"] = 0.0

我想要过滤字典,只包含值大于零的键值对。

在C#中,我会做类似这样的操作:

   dict = dict.Where(r=>r.Value > 0);

Python中的等效代码是什么?

6个回答

49
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}

请注意,这并不严格是一个过滤器,因为它会创建一个新的字典。


1
如果您想按键过滤怎么办? - fraxture
1
改为测试 k 而不是 v - kindall

2

尝试

y = filter(lambda x:dict[x] > 0.0,dict.keys())

lambda函数从字典中获取键,并比较每个键在字典中的值是否符合条件,然后返回符合条件的键。


1
提问者希望返回一个字典,但这只返回字典的键。而且它比@kindall的答案简单得多/不如Pythonic。 - Jeremy Lewis
2
可以这样写:d = dict(filter(lambda x: x[1] > 0.0, d.items())) - Jeffery
可能想要使用 list(filter(...)) - Andrew

0
假设您的原始字典是d1,您可以使用类似以下的代码:
d2 = dict((k, v) for k, v in d1.items() if v > 0)

顺便提一下,注意在Python中,dict已经被保留了。

0

dict 构造函数可以接受一个 (key,value) 对的序列,而字典的 iteritems 方法会产生一个 (key,value) 对的序列。这是两种完美结合的味道。

newDict = dict([item for item in oldDict.iteritems() if item[1] > 0])

0
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 替换了它。


0
首先,您不应该使用关键字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

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