удаление словарных записей без значений- Python - PullRequest
7 голосов
/ 10 июня 2011

Если у меня есть словарь, и я хочу удалить записи, в которых значение представляет собой пустой список [] как мне поступить?

Я пытался:

for x in dict2.keys():
    if dict2[x] == []:
        dict2.keys().remove(x)

но это не сработало.

Ответы [ 8 ]

12 голосов
/ 10 июня 2011

.keys() обеспечивает доступ к списку ключей в словаре, но изменения в нем (не обязательно) отражаются в словаре. Вам нужно использовать del dictionary[key] или dictionary.pop(key), чтобы удалить его.

Из-за поведения в некоторой версии Python вам нужно создать копию списка ваших ключей, чтобы все работало правильно. Таким образом, ваш код будет работать, если написано как:

for x in list(dict2.keys()):
    if dict2[x] == []:
        del dict2[x]
10 голосов
/ 10 июня 2011

Новые версии Python поддерживают DICT-понимания:

dic = {i:j for i,j in dic.items() if j != []}

Они гораздо более удобочитаемы, чем фильтр или циклы

3 голосов
/ 10 июня 2011
for x in dict2.keys():
    if dict2[x] == []:
        del dict2[x]
2 голосов
/ 04 декабря 2012

Почему бы просто не оставить те, которые не пусты, и позволить gc удалить остатки? Я имею в виду:

dict2 = dict( [ (k,v) for (k,v) in dict2.items() if v] )
1 голос
/ 10 июня 2011

С объектом генератора вместо списка:

a = {'1': [], 'f':[1,2,3]}
dict((data for data in a.iteritems() if data[1]))
1 голос
/ 10 июня 2011

Очистите один, но он создаст копию этого диктанта:

dict(filter(lambda x: x[1] != [], d.iteritems()))
1 голос
/ 10 июня 2011
for key in [ k for (k,v) in dict2.items() if not v ]:
  del dict2[key]
0 голосов
/ 22 августа 2015
def dict_without_empty_values(d):
    return {k:v for k,v in d.iteritems() if v}


# Ex;
dict1 = {
    'Q': 1,
    'P': 0,
    'S': None,
    'R': 0,
    'T': '',
    'W': [],
    'V': {},
    'Y': None,
    'X': None,
}

print dict1
# {'Q': 1, 'P': 0, 'S': None, 'R': 0, 'T': '', 'W': [], 'V': {}, 'Y': None, 'X': None}

print dict_without_empty_values(dict1)
# {'Q': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...