我有一个字符串键和浮点值的字典。
mydict = {}
mydict["joe"] = 20
mydict["bill"] = 20.232
mydict["tom"] = 0.0
我想过滤字典,只包含值大于零的对。
在C#中,我会做这样的事情:
dict = dict.Where(r=>r.Value > 0);
Python中的等效代码是什么?
答案 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