2011-12-08 50 views
15

我有一個字符串鍵和浮點值的字典。在Python中過濾字典的最佳方法

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

我想篩選字典以僅包含具有大於零值的對。

在C#中,我會做這樣的事情:

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

什麼是Python中的等同的代碼?

回答

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

注意,因爲它創建一個新的字典,這不是嚴格意義上的過濾器。

0

假設你原來的字典是d1你可以使用類似:

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

順便說一句,注意dict在蟒蛇已被保留。

0

dict構造可以採取(key,value)對的序列,並且一個字典的iteritems方法產生的(key,value)雙的序列。這是兩個偉大的口味,味道很棒。

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

嘗試

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

拉姆達從字典喂鍵和值的字典爲每個鍵進行比較,根據標準,返回回可接受密鑰。

+1

問題正在尋找返回字典,這隻返回字典的鍵。它比@ kindall的答案 –

+1

可能是這樣的效率/ pythonic效率更低:'d = dict(filter(lambda x:x [1]> 0.0,d.items()))'' – Jeffery

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