【问题标题】:Silently removing key from a python dict [duplicate]从python dict中默默地删除密钥[重复]
【发布时间】:2012-07-06 16:31:44
【问题描述】:

我有一个 python dict,我想从我的字典中默默地删除 None'' 键,所以我想出了这样的东西:

try:
    del my_dict[None]
except KeyError:
    pass

try:
    del my_dict['']
except KeyError:
   pass

如您所见,它的可读性较差,并且会导致我编写重复的代码。所以我想知道python中是否有一种方法可以从dict中删除任何键而不抛出键错误?

【问题讨论】:

  • 你不是在这里混合valueskeys吗?
  • 我很困惑,为什么dict.keys()中不会出现key?

标签: python dictionary


【解决方案1】:

如果存在键,以下将删除键,并且不会引发错误:

for d in [None, '']:
    if d in my_dict:
        del my_dict[d]

【讨论】:

  • @ozgurv 字典查找不是 O(n),而是 O(1)
  • @ozgurv:检查一个键是否在字典中是 O(1),从字典中删除一个键也是如此。但是,它确实会导致您进行两次查找而不是一次。
  • @ozgurv 不,不是。查看time complexity 上的 Python 文档以了解数据结构。您也不是在寻找最终出现在摊销案例中的密钥。
  • @ozgurv 在 Python 3 中 dict.keys 不再返回列表,因此它们实际上应该是相同的。
  • @jamylak 你绝对是对的,我不明白为什么它返回一个列表而不是一个集合。
【解决方案2】:

你可以试试:

d = dict((k, v) for k,v in d.items() if k is not None and k != '')

或删除所有类似空的键

d = dict((k, v) for k,v in d.items() if k )

【讨论】:

  • 不需要[]。您正在创建一个不必要的中间列表理解。如果删除它们,将使用更高效的生成器。
【解决方案3】:

你可以这样做:

d.pop("", None)
d.pop(None, None)

弹出带有您忽略的默认值的字典。

【讨论】:

  • 小心不要写 d.pop(None) - 因为这会引发 KeyError 因为没有提供默认值
  • 如何删除带有None 值的键?
  • knowbody:你可以完全按照上面的答案说:d.pop(None, None)
  • 遇到了 andy boot 提到的问题。为清楚起见,以下是文档所说的:If default is not given and key is not in the dictionary, a KeyError is raised.
【解决方案4】:

您可以使用dict.pop 方法并忽略结果:

for key in [None, '']:
    d.pop(key, None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2017-12-21
    • 2016-07-26
    • 2017-11-07
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多