У меня dict
есть целая куча записей. Меня интересуют только некоторые из них. Есть ли простой способ удалить все остальные?
python
dictionary
mpen
источник
источник
Ответы:
Построение нового диктата:
Использует словарное понимание.
Если вы используете версию, в которой их нет (например, Python 2.6 и более ранние версии), сделайте это
dict((your_key, old_dict[your_key]) for ...)
. Это то же самое, хотя и хуже.Обратите внимание, что это, в отличие от версии jnnnnn, имеет стабильную производительность (зависит только от количества ваших_ключей) для
old_dict
s любого размера. И с точки зрения скорости и памяти. Поскольку это выражение генератора, оно обрабатывает один элемент за раз и не просматривает все элементы old_dict.Удаление всего на месте:
источник
old_dict
случаев, когда пропущенный ключ указывает на ошибку в другом месте, и в этом случае я очень предпочитаю ошибку, а не просто неверные результаты.Чуть более элегантное понимание:
источник
mydict.iteritems()
вместо этого..items()
создает другой список.Вот пример в Python 2.6:
Фильтрующая часть - это
if
утверждение.Этот метод медленнее, чем ответ Делнана, если вы хотите выбрать только несколько из очень многих ключей.
источник
if key in ('x','y','z')
я думаю.Вы можете сделать это с помощью функции проекта из моей библиотеки funcy :
Также взгляните на select_keys .
источник
Код 1:
Код 2:
Код 3:
Производительность всех частей кода измеряется с помощью timeit, используя число = 1000, и собирается 1000 раз для каждого фрагмента кода.
Для python 3.6 производительность трех способов фильтрации ключей dict практически одинакова. Для Python 2.7 код 3 немного быстрее.
источник
Этот лайнер лямбда должен работать:
Вот пример:
Это базовое понимание списка, повторяющееся над вашими ключами dict (i в x), и выводит список пар кортежей (ключ, значение), если ключ находится в вашем желаемом списке ключей (y). Dict () оборачивает все это для вывода как объект dict.
источник
set
дляwanted_keys
, но в остальном выглядит хорошо.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
он возвращается{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
как задумано.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
и результат был{}
, который я принял за чистый диктат.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
я получаю:{'0': [1, 3], '2': [1, 4]}
Учитывая ваш оригинальный словарь
orig
и набор записей, которые вас интересуютkeys
:что не так приятно, как ответ Делнана, но должно работать в любой интересующей версии Python. Однако он хрупок по отношению к каждому элементу,
keys
существующему в исходном словаре.источник
На основании принятого ответа Делнана.
Что если один из ваших разыскиваемых ключей отсутствует в old_dict? Решение delnan выдаст исключение KeyError, которое вы можете перехватить. Если это не то, что вам нужно, может быть, вы хотите:
включайте только ключи, которые исключаются как из old_dict, так и из вашего набора wanted_keys.
иметь значение по умолчанию для ключей, которые не установлены в old_dict.
источник
{k: old_dict.get(k, default) for k in ...}
Эта функция сделает свое дело:
Как и версия delnan, в этой версии используется словарное понимание и стабильная производительность для больших словарей (зависит только от количества разрешенных вами ключей, а не от общего количества ключей в словаре).
И так же, как и версия MyGGan, эта позволяет вашему списку ключей включать ключи, которые могут отсутствовать в словаре.
И в качестве бонуса, вот обратное, где вы можете создать словарь, исключив определенные ключи в оригинале:
Обратите внимание, что в отличие от версии delnan, операция не выполняется на месте, поэтому производительность зависит от количества ключей в словаре. Однако преимущество этого в том, что функция не будет изменять предоставленный словарь.
Редактировать: Добавлена отдельная функция для исключения определенных ключей из dict.
источник
keys
любой вид повторения, например, какой набор принимает.invert
подразумевает ли это, чтоkeys
аргумент сохраняется или чтоkeys
аргумент отклонен?», Сколько из них согласится?Если мы хотим создать новый словарь с удаленными выбранными ключами, мы можем использовать словарное понимание.
Например:
источник
Другой вариант:
Но вы получаете
list
(Python 2) или итератор (Python 3), возвращенныйfilter()
, а не adict
.источник
filtered
вdict
и вы получите обратно словарь!Краткая форма:
Как подсказывает большинство ответов, чтобы сохранить краткость, мы должны создать дублированный объект, будь то
list
илиdict
. Этот создает одноразовый,list
но удаляет ключи в оригиналеdict
.источник
Вот еще один простой метод, использующий
del
в одном вкладыше:e_keys
список ключей, которые нужно исключить Это обновит ваш диктант, а не даст вам новый.Если вы хотите новый вывод dict, то сделайте копию dict перед удалением:
источник
Вы могли бы использовать
python-benedict
, это подкласс dict.Установка:
pip install python-benedict
Это открытый исходный код на GitHub: https://github.com/fabiocaccamo/python-benedict
Отказ от ответственности: я автор этой библиотеки.
источник