2010-03-30 1 views
19

Что-то вроде:Как я могу избавиться от значений None в словаре?

for (a,b) in kwargs.iteritems(): 
    if not b : del kwargs[a] 

Этого кода рейз исключение, потому что изменение словаря при итерации.

я обнаруживаю только не хорошенькое решение с другим словарем:

res ={} 
res.update((a,b) for a,b in kwargs.iteritems() if b is not None) 

Благодарность

ответ

32

Другой способ написать это

res = dict((k,v) for k,v in kwargs.iteritems() if v is not None) 

В Python3, это становится

res = {k:v for k,v in kwargs.items() if v is not None} 
5

Мне нравится изменение вашего второго метода:

res = dict((a, b) for (a, b) in kwargs.iteritems() if b is not None) 

это Pythonic, и я не думаю, это ужасно. Разновидностью ваш первый является:

for (a, b) in list(kwargs.iteritems()): 
     if b is None: 
      del kwargs[a] 
+1

Вы можете просто использовать kwargs.items(), который уже возвращает список. – liori

+0

'dict.items()' больше не возвращает список в Python3. Он больше похож на 'iteritems()' –

4

Вы также можете использовать filter:

d = dict(a = 1, b = None, c = 3) 

filtered = dict(filter(lambda item: item[1] is not None, d.items())) 

print(filtered) 
{'a': 1, 'c': 3} 
2
d = {'a': None, 'b': 'myname', 'c': 122} 
print dict(filter(lambda x:x[1], d.items())) 
{'b': 'myname', 'c': 122} 
+2

В дополнение к коду, принято добавлять комментарии к вашему ответу. – aliteralmind

+0

Спасибо. Сделаю это со следующего раза. – Sandilya

Смежные вопросы