如何在Python中过滤字典?

时间:2010-12-19 19:29:17

标签: python dictionary

d = {'foo': 'x',
     'bar': 'y',
     'zoo': 'None',
     'foobar': 'None'}

我想过滤所有值为'None'的项目,并使用特定值更新foobar项。我试过了:

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

但它没有用。

5 个答案:

答案 0 :(得分:18)

目前尚不清楚您发布的词典中的'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)

答案 1 :(得分:14)

目前尚不清楚您从哪里获得'updated'值,但一般来说它看起来像这样:

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

在python2.7或更新版本中。

答案 2 :(得分:2)

这样的事情应该有效

>>> for x in [x for x in d.keys() if d[x] == 'None']:
        d.pop(x)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以尝试编写常规的过滤器功能:

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兼容而编写的。里程可能会有所不同。

关于此的很酷的事情是,它允许您传递任意的lambda进行过滤,而不是对特定条件进行硬编码。另外,它并不比这里的任何其他解决方案慢。此外,如果您使用我提供的第一个解决方案,则可以遍历结果。