Как отфильтровать словарь в Python? - PullRequest
8 голосов
/ 19 декабря 2010
d = {'foo': 'x',
     'bar': 'y',
     'zoo': 'None',
     'foobar': 'None'}

Я хочу отфильтровать все элементы, значение которых равно 'None', и обновить элементы foo и bar определенным значением. Я попробовал:

for i in x.items():
   ....:    if i[i] == 'None':
   ....:        x.pop(i[0])
   ....:    else:
   ....:        x.update({i[0]:'updated'}) 

Но это не работает.

Ответы [ 5 ]

18 голосов
/ 19 декабря 2010

Непонятно, что такое 'None' в словаре, который вы разместили.Если это строка, вы можете использовать следующее:

dict((k, 'updated') for k, v in d.iteritems() if v != 'None')

Если это None, просто замените проверку, например:

dict((k, 'updated') for k, v in d.iteritems() if v is None)
14 голосов
/ 19 декабря 2010

неясно, откуда вы получаете значение 'updated', но в целом это будет выглядеть так:

{i: 'updated' for i, j in d.items() if j != 'None'}

в python2.7 или новее.

2 голосов
/ 19 декабря 2010

Примерно так должно работать

>>> for x in [x for x in d.keys() if d[x] == 'None']:
        d.pop(x)
0 голосов
/ 26 октября 2018

Вы можете попробовать написать общую функцию фильтра:

def filter(dict, by_key = lambda x: True, by_value = lambda x: True):
    for k, v in dict.items():
        if (by_key(k) and by_value(v)):
            yield (k, v)

или

def filter(dict, by_key = lambda x: True, by_value = lambda x: True):
    return dict((k, v) for k, v in dict.items() if by_key(k) and by_value(v))

и тогда вы можете сделать это:

new_d = dict(filter(d, by_key = lambda k: k != 'None'))

Обратите внимание, что это написано для совместимости с Python 3. Пробег может отличаться.

Крутая вещь в этом заключается в том, что он позволяет передавать произвольные лямбда-выражения для фильтрации вместо жесткого кодирования определенного условия. Плюс, это не медленнее, чем любое другое решение здесь. Кроме того, если вы используете первое решение, которое я предоставил, вы можете перебрать результаты.

0 голосов
/ 19 декабря 2010
new_d = dict((k, 'updated') for k, v in d.iteritems() if k != 'None')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...