Отфильтровать словарь по ключам и/или значениям в Python можно двумя способами:
Идея фильтрации словаря состоит в том, что бы при помощи представления dict.items()
преобразовывать словарь в список кортежей (key, value)
, отобрать из этого списка нужные кортежи в зависимости от их значений и добавить их в новый словарь.
Все эти действия можно записать в одну строку при помощи выражения-генератора словаря.
Для лучшего понимания, посмотрите развернутый код идеи:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # Метод dict.items - представление словаря, которое # представляет собой список кортежей `(key, value)` >>> d.items() # dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]) # создаем новый отфильтрованный словарь dict_filter = {} # в цикле распаковываем словарные # кортежи на ключ и значение for k, v in d.items(): if k in ('a', 'c', 'e') and v > 1: # добавляем в новый словарь dict_filter[k] = v >>> dict_filter {'c': 3, 'e': 5}
Фильтр словаря по ключам:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # отберем элементы словаря, ключи которых # имеют значения 'a' или 'c' или 'e' >>> {key: val for key, val in d.items() if key in ('a', 'c', 'e')} # {'a': 1, 'c': 3, 'e': 5}
Фильтр словаря по значениям:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # отберем элементы словаря, значения которых больше 1 >>> {key: val for key, val in d.items() if val > 3} # {'d': 4, 'e': 5} # теперь отберем элементы словаря, значения которых # имеют четное значение (делятся на 2 без остатка) >>> {key: val for key, val in d.items() if not val%2} # {'b': 2, 'd': 4}
Фильтр словаря по ключам и значениям:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # отберем элементы словаря, ключи которых имеют значения 'a' или # 'c' или 'e', а значения этих ключей должны быть больше 1 >>> {key: val for key, val in d.items() if key in ('a', 'c', 'e') and val > 1} # {'c': 3, 'e': 5}
filter()
для фильтрации словаря.Фильтр словаря по значениям:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # четные значения ключей словаря (делятся на 2 без остатка) >>> dict(filter(lambda item: item[1]%2 == 0, d.items())) # {'b': 2, 'd': 4}
Фильтр словаря по ключам:
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # четные значения ключей словаря (делятся на 2 без остатка) >>> dict(filter(lambda item: item[0] in ('a', 'c', 'e'), d.items())) # {'a': 1, 'c': 3, 'e': 5}
Фильтр словаря по ключам и значениям:
При использовании встроенной функции filter()
, вместо лямбда выражения можно использовать полноценную функцию Python. Эта функция должна принимать один аргумент: кортеж представления словаря (key, val)
, а возвращать - значение bool
: если возвращается True
то filter()
пропускает элемент словаря, если False
то отбрасывает.
def fkv(items): # распаковываем кортеж key, val = items if key in ('a', 'c', 'e') and val > 1: return True return False >>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} >>> dict(filter(fkv, d.items())) # {'c': 3, 'e': 5}