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'})
但它没有用。
答案 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进行过滤,而不是对特定条件进行硬编码。另外,它并不比这里的任何其他解决方案慢。此外,如果您使用我提供的第一个解决方案,则可以遍历结果。