Сообщить об ошибке.

Отбор ключей и/или значения словаря по условию

Отфильтровать словарь по ключам и/или значениям в Python можно двумя способами:

  1. При помощи выражения-генератора словаря.
  2. Используя встроенную функцию filter().

Идея фильтрации словаря состоит в том, что бы при помощи представления 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}