Как отфильтровать словарь, чтобы оставить только определенные ключи?
У меня есть dict с множеством записей, но меня интересуют только некоторые из них. Есть ли простой способ удалить все остальные записи?
5 ответ(ов)
Создание нового словаря:
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]
Вы можете использовать генераторное выражение для создания более элегантного словаря с помощью конструкции dict(). Вот как это можно сделать:
foodict = dict((k, v) for k, v in mydict.items() if k.startswith('foo'))
Этот способ также создает новый словарь, включая только те элементы, ключи которых начинаются с 'foo'. Использование dict() делает код чуть более читаемым, особенно для тех, кто не привык к выражениям словарей.
Вот пример на 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, если вам нужно выбрать всего несколько ключей из большого количества.
Этот однострочный лямбда-выражение должно работать:
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() оборачивает всё это, чтобы вернуть результат в виде объекта словаря.
Если у вас есть исходный словарь orig и множество ключей, которые вас интересуют, то вы можете использовать следующий код для фильтрации:
filtered = dict(zip(keys, [orig[k] for k in keys]))
Хотя это не так красиво, как ответ delnan, это решение будет работать в любой версии Python, которая вас интересует. Однако стоит отметить, что данный способ может быть уязвим - он предполагает, что каждый элемент из keys существует в вашем оригинальном словаре. Если какого-то ключа не будет в orig, это вызовет ошибку.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?