Как отфильтровать словарь, чтобы оставить только определенные ключи?
У меня есть 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'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?