在python中从dict中删除值
此代码:在python中从dict中删除值,python,logic,Python,Logic,此代码: 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 '' 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次才能实现。您能推荐一种更优化的方法吗。这里有两个问题:
v不是“”
应该是v!=''代码>。您应该始终使用==
和=
比较两个值,因为是
和不是
用于比较两个对象的标识
和
而不是或
。否则,此条件:
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
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])
你只需要这个:
dict([x for x in d.items() if x[1]])
由于
'
,None
,{}
代表同一事物False
,当它们在if
中使用时,你需要和
,而不是或
。我想你的意思是在你的参数之间使用and。“如果v不是“”,或v!={}”始终为真!但是,“if v”将为“”和{}返回False,因此最有效的是第二个示例中的最后一个。谢谢,我不知道我怎么会错过它。