在Python中过滤字典的最佳方法

时间:2011-12-08 01:28:50

标签: python dictionary lambda

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

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

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

在C#中,我会做这样的事情:

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

Python中的等效代码是什么?

6 个答案:

答案 0 :(得分:43)

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 :(得分:0)

假设您的原始词典是d1,您可以使用以下内容:

d2 = dict((k, v) for k, v in d1.items() if v > 0)

顺便说一句,请注意dict已在python中保留。

答案 2 :(得分:0)

dict构造函数可以采用(key,value)对序列,而dict的iteritems方法会产生(key,value)对序列。这是两种口味很好的味道。

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

答案 3 :(得分:0)

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

lambda从dict中提供密钥,并根据条件比较每个密钥的dict中的值,然后返回可接受的密钥。

答案 4 :(得分: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。

答案 5 :(得分: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