Если вам действительно нужно изменить исходный словарь:
empty_keys = [k for k,v in metadata.iteritems() if not v]
for k in empty_keys:
del metadata[k]
Обратите внимание, что мы должны составить список пустых ключей, потому что мы не можем изменять словарь во время итерации по нему (как вы могли заметить). Это менее затратно (с точки зрения памяти), чем создание нового словаря, если только не будет много записей с пустыми значениями.
nneonneo
источник
источник
.iteritems()
с.items()
, первый больше не работает в последних версиях Python.Ответы:
Решение BrenBarn идеальное (и, я мог бы добавить, питоническое ). Однако вот еще одно (fp) решение:
источник
Если вам нужен полнофункциональный, но емкий подход к работе с реальными структурами данных, которые часто являются вложенными и могут даже содержать циклы, я рекомендую взглянуть на утилиту переназначения из пакета утилит boltons .
После
pip install boltons
копирования iterutils.py в проект или его копирования просто выполните:На этой странице есть еще много примеров, в том числе те, которые работают с гораздо более крупными объектами из API Github.
Это чистый Python, поэтому он работает везде и полностью протестирован на Python 2.7 и 3.3+. Лучше всего то, что я написал его именно для таких случаев, поэтому, если вы обнаружите, что он не обрабатывается, вы можете исправить ошибку прямо здесь .
источник
На основе решения Райана , если у вас также есть списки и вложенные словари:
Для Python 2:
Для Python 3:
источник
d = { "things": [{ "name": "" }] }
Если у вас есть вложенный словарь, и вы хотите, чтобы это работало даже для пустых подэлементов, вы можете использовать рекурсивный вариант предложения BrenBarn:
источник
items()
вместоiteritems()
Python 3Быстрый ответ (TL; DR)
Example01
Подробный ответ
проблема
Решение
Ловушки
Альтернативный пример
Example02
Смотрите также
источник
Для Python 3
источник
Основываясь на ответах patriciasz и nneonneo , и учитывая возможность того, что вы можете захотеть удалить ключи, которые содержат только определенные ложные вещи (например
''
), но не другие (например0
), или, возможно, вы даже хотите включить некоторые правдивые вещи (например'SPAM'
) , то вы можете составить очень конкретный список результатов:К сожалению, это не совсем работает, потому что, например,
0 in unwanted
оцениваетсяTrue
. Нам нужно различать0
и другие ложные вещи, поэтому мы должны использоватьis
:... оценивается в
False
.Теперь используйте его для
del
ненужных вещей:Если вам нужен новый словарь вместо изменения
metadata
на месте:источник
[]
Я прочитал все ответы в этом потоке, а некоторые также ссылались на этот поток: Удалить пустые словари во вложенном словаре с помощью рекурсивной функции
Первоначально я использовал решение, и оно отлично работало:
Попытка 1: слишком горячая (неэффективная и не перспективная) :
Но в мире Python 2.7 возникли некоторые проблемы с производительностью и совместимостью:
isinstance
вместоtype
for
цикл для эффективностиitems
вместоiteritems
Попытка 2: Слишком холодно (не хватает воспоминаний) :
DOH! Это не рекурсивно и совсем не запоминает.
Попытка 3: Совершенно верно (пока) :
источник
Dicts, смешанные с массивами
if isinstance(v, list):
, который очищает список с использованием исходнойscrub_dict(d)
реализации.источник
Альтернативный способ сделать это - использовать понимание словаря. Это должно быть совместимо с
2.7+
источник
Вот вариант, если вы используете
pandas
:источник
Некоторые из упомянутых выше методов игнорируют, есть ли какие-либо целые числа и плавают со значениями 0 и 0,0.
Если кто-то хочет избежать вышеуказанного, можно использовать приведенный ниже код (удаляет пустые строки и значения None из вложенного словаря и вложенного списка):
источник
"Поскольку я в настоящее время пишу настольное приложение для моей работы с Python, я обнаружил в приложении ввода данных, когда есть много записей, и некоторые из них не являются обязательными, поэтому пользователь может оставить поле пустым, для проверки его легко взять все записи, а затем отбросить пустой ключ или значение словаря. Итак, мой код выше показывает, как мы можем легко удалить их, используя понимание словаря и сохраняя элемент значения словаря, который не является пустым. Я использую Python 3.8.3
источник
Некоторые тесты:
1. Понимание списка воссоздает dict
2. Понимание списка воссоздает dict с помощью dict ()
3. Зациклить и удалить ключ, если v равно None
поэтому цикл и удаление являются самыми быстрыми при 160 нс, понимание списка вдвое медленнее при ~ 375 нс, а с вызовом снова
dict()
вдвое медленнее ~ 680 нс.Обертывание 3 в функцию снова снижает его примерно до 275 нс. Также для меня PyPy был примерно в два раза быстрее, чем neet python.
источник
list(dic.items())
py 3. Тогда понимание dict ftw? del по-прежнему кажется быстрее при низком соотношении значений Null / empty. Я предполагаю, что создание этого списка так же плохо для потребления памяти, чем просто воссоздание dict.