此代码:
a = {'sd':{},'sdd':'','sadfas':None,'sadfa':'dsf'}
a = dict((k, v) for k, v in a.iteritems() if v is not '' or v != {} or v is not None)
print a
打印:
{'sdd': '', 'sadfas': None, 'sadfa': 'dsf', 'sd': {}}
但是,它不会从我需要删除的dict中删除所有类型的值。那是为什么?
如果我这样做,将删除这些值:
a = {'sd':{},'sdd':'','sadfas':None,'sadfa':'dsf'}
a=dict((k, v) for k, v in a.iteritems() if v is not '')
a=dict((k, v) for k, v in a.iteritems() if v is not None)
a=dict((k, v) for k, v in a.iteritems() if v)
print a
打印:
{'sadfa': 'dsf'}
这是我们想要的,但我必须迭代字典3次才能实现。你能建议一种更优化的方式。
答案 0 :(得分:3)
这里有两个问题:
v is not ''
应为v != ''
。您应始终使用==
和!=
来比较两个值,因为is
和is not
用于比较两个对象的标识。
您需要使用and
代替or
。否则,这个条件:
v != '' or v != {} or v is not None
始终为True
,因为v
将始终不等于''
或不等于{}
。
以下是您的代码的固定版本:
>>> a = {'sd':{},'sdd':'','sadfas':None,'sadfa':'dsf'}
>>> a = dict((k, v) for k, v in a.iteritems() if v != '' and v != {} and v is not None)
>>> a
{'sadfa': 'dsf'}
>>>
但是,我们可以进一步简化:
>>> a = {'sd':{},'sdd':'','sadfas':None,'sadfa':'dsf'}
>>> a = dict((k, v) for k, v in a.iteritems() if v)
>>> a
{'sadfa': 'dsf'}
>>>
此解决方案有效,因为''
,{}
和None
都评估为False
。
答案 1 :(得分:0)
empties = ('', {}, None)
{k:v for k,v in a.items() if v not in empties}
# for your input this would work too,
# as all 'emtpies' evaluate to False:
{k:v for k,v in a.items() if v}
# or if you want to remove in-place:
for key in a.keys():
# if a[key] in empties:
if not a[key]:
del a[key]
以上在python 2.7+中工作,如果你需要早期版本的解决方案,你可以使用dict()
和生成器理解:
dict((k,v) for (k,v) in a.items() if v)
# or
dict(element for element in a.items() if element[1])
答案 2 :(得分:0)
你只需要这个:
dict([x for x in d.items() if x[1]])
由于''
,None
,{}
代表同一事物False
,当它们在if
中使用时。{/ p>