2011-12-08 4 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()) 

лямбда будет кормить ключи от Dict, и сравнивает значения в Словаре для каждого ключа, в соответствии с критериями, возвращаясь обратно допустимые ключи.

+1

Вопросник хочет вернуть словарь, это возвращает только ключи словаря. И это просто менее эффективно/Pythonic, чем ответ @ kindall –

+1

может быть следующим: '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, так что я заменил его обув.

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} 

Кроме того, вы можете просто создать генератор и итератор над ним напрямую. Это больше похоже на «фильтр», потому что генератор ссылается только на значения в исходном dict вместо создания копии подмножества; и, следовательно, более эффективен, чем создание нового словаря:

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 
Смежные вопросы