【问题标题】:Removing values from dict in python从python中的dict中删除值
【发布时间】:2014-04-22 22:45:32
【问题描述】:

这段代码:

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 次才能实现。你能推荐一个更优化的方法吗?

【问题讨论】:

  • 你需要and,而不是or
  • 我认为您的意思是在您的论点之间使用 AND。 “如果 v 不是 '' 或 v != {}”始终为真!但是,"if v" 将为 '' 和 {} 返回 False,因此最有效的是第二个示例中的最后一个。
  • 谢谢,我不知道我是怎么错过的。

标签: python logic


【解决方案1】:

这里有两个问题:

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

  2. 您需要使用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

【讨论】:

    【解决方案2】:
    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])
    

    【讨论】:

      【解决方案3】:

      你只需要这个:

      dict([x for x in d.items() if x[1]])
      

      因为''None{}if中使用时代表相同的东西False

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 2012-10-20
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        相关资源
        最近更新 更多