我有一个字符串键和浮点数值的字典。
mydict = {}
mydict["joe"] = 20
mydict["bill"] = 20.232
mydict["tom"] = 0.0
我想要过滤字典,只包含值大于零的键值对。
在C#中,我会做类似这样的操作:
dict = dict.Where(r=>r.Value > 0);
Python中的等效代码是什么?
我有一个字符串键和浮点数值的字典。
mydict = {}
mydict["joe"] = 20
mydict["bill"] = 20.232
mydict["tom"] = 0.0
我想要过滤字典,只包含值大于零的键值对。
在C#中,我会做类似这样的操作:
dict = dict.Where(r=>r.Value > 0);
Python中的等效代码是什么?
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}
请注意,这并不严格是一个过滤器,因为它会创建一个新的字典。
尝试
y = filter(lambda x:dict[x] > 0.0,dict.keys())
lambda函数从字典中获取键,并比较每个键在字典中的值是否符合条件,然后返回符合条件的键。
d = dict(filter(lambda x: x[1] > 0.0, d.items()))
- Jefferylist(filter(...))
。 - Andrewd1
,您可以使用类似以下的代码:d2 = dict((k, v) for k, v in d1.items() if v > 0)
dict
已经被保留了。dict
构造函数可以接受一个 (key,value)
对的序列,而字典的 iteritems
方法会产生一个 (key,value)
对的序列。这是两种完美结合的味道。
newDict = dict([item for item in oldDict.iteritems() if item[1] > 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 替换了它。
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
k
而不是v
? - kindall