8

Как отфильтровать словарь, чтобы оставить только определенные ключи?

22

У меня есть dict с множеством записей, но меня интересуют только некоторые из них. Есть ли простой способ удалить все остальные записи?

5 ответ(ов)

10

Создание нового словаря:

dict_you_want = {key: old_dict[key] for key in your_keys}

Использует генерацию словарей.

Если вы используете более старую версию, которая не поддерживает эту конструкцию (например, Python 2.6 и ранее), используйте dict((key, old_dict[key]) for ...). Это то же самое, хотя и менее красиво.

Обратите внимание, что это, в отличие от версии jnnnnn, имеет стабильную производительность (зависит только от числа your_keys) для словарей old_dict любого размера. Это касается как скорости, так и памяти. Поскольку это выражение-генератор, оно обрабатывает один элемент за раз и не проходит по всем элементам old_dict.

Для удаления всего на месте:

unwanted = set(old_dict) - set(your_keys)
for unwanted_key in unwanted: del your_dict[unwanted_key]
2

Вы можете использовать генераторное выражение для создания более элегантного словаря с помощью конструкции dict(). Вот как это можно сделать:

foodict = dict((k, v) for k, v in mydict.items() if k.startswith('foo'))

Этот способ также создает новый словарь, включая только те элементы, ключи которых начинаются с 'foo'. Использование dict() делает код чуть более читаемым, особенно для тех, кто не привык к выражениям словарей.

0

Вот пример на Python 2.6:

>>> a = {1: 1, 2: 2, 3: 3}
>>> dict((key, value) for key, value in a.iteritems() if key == 1)
{1: 1}

Часть фильтрации здесь выполняет оператор if.

Однако, стоит отметить, что этот метод может оказаться медленнее, чем ответ delnan, если вам нужно выбрать всего несколько ключей из большого количества.

0

Этот однострочный лямбда-выражение должно работать:

dictfilt = lambda x, y: dict([ (i, x[i]) for i in x if i in set(y) ])

Вот пример использования:

my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}
wanted_keys = ("c", "d")

# Запуск
dictfilt(my_dict, wanted_keys)
# Вывод: {'c': 3, 'd': 4}

Это простое списковое выражение, которое проходит по ключам вашего словаря (i in x) и выводит список кортежей (ключ, значение), если ключ содержится в вашем списке желаемых ключей (y). Функция dict() оборачивает всё это, чтобы вернуть результат в виде объекта словаря.

0

Если у вас есть исходный словарь orig и множество ключей, которые вас интересуют, то вы можете использовать следующий код для фильтрации:

filtered = dict(zip(keys, [orig[k] for k in keys]))

Хотя это не так красиво, как ответ delnan, это решение будет работать в любой версии Python, которая вас интересует. Однако стоит отметить, что данный способ может быть уязвим - он предполагает, что каждый элемент из keys существует в вашем оригинальном словаре. Если какого-то ключа не будет в orig, это вызовет ошибку.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь