在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,因此最有效的是第二个示例中的最后一个。谢谢,我不知道我怎么会错过它。