从python中的dict中删除值

时间:2014-04-22 22:45:33

标签: 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 '')
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次才能实现。你能建议一种更优化的方式。

3 个答案:

答案 0 :(得分:3)

这里有两个问题:

  1. v is not ''应为v != ''。您应始终使用==!=来比较两个值,因为isis not用于比较两个对象的标识

  2. 您需要使用and代替or。否则,这个条件:

    v != '' or v != {} or v is not None
    

    始终为True,因为v将始终不等于''或不等于{}

  3. 以下是您的代码的固定版本:

    >>> 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>