Лучший способ фильтрации словаря в Python

У меня есть словарь строковых ключей и значений float.

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

Я хочу отфильтровать словарь, чтобы включать только пары, у которых значение больше нуля.

В С# я сделал бы что-то вроде этого:

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

Что такое эквивалентный код в Python?

Ответ 1

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}

Обратите внимание, что это не строго фильтр, потому что он создает новый словарь.

Ответ 2

попробовать

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

lambda подает ключи от dict и сравнивает значения в dict для каждой клавиши, по критериям, возвращая приемлемые ключи.

Ответ 3

Предполагая, что ваш оригинальный словарь d1, вы можете использовать что-то вроде:

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

Кстати, обратите внимание, что dict уже зарезервирован в python.

Ответ 4

Конструктор dict может принимать последовательность пар (key,value), а метод iteritems метода dict дает последовательность пар (key,value). Это два отличных вкуса, которые отлично сочетаются.

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

Ответ 5

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.

Ответ 6

в первую очередь вам не следует использовать ключевое слово 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