从Python字典中静默删除键

83
我有一个Python字典,我想要在不显示任何消息的情况下从我的字典中删除None''键。因此,我想出了以下代码:
try:
    del my_dict[None]
except KeyError:
    pass

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

正如您所看到的,它不太易读,并且导致我编写重复的代码。因此,我想知道Python中是否有一种方法可以从字典中删除任何键而不引发键错误?


3
你这里是不是混淆了“值”和“键”? - Martijn Pieters
我很困惑,为什么一个键不会出现在 dict.keys() 中? - acattle
4个回答

150
你可以这样做:
d.pop("", None)
d.pop(None, None)

弹出一个带有默认值的字典,而你忽略了这个默认值。


4
注意不要写d.pop(None) - 这会引发KeyError,因为没有提供默认值。 - andy boot
жИСиѓ•е¶ВдљХеИ†йЩ§еАЉдЄЇNoneзЪДйФЃпЉЯ - knowbody
1
知道吗:你可以完全按照上面的答案所说的方式执行 d.pop(None, None)。 - deadbeef404
遇到了andy boot提到的陷阱。为了明确起见,这里是文档说的内容:“如果未指定默认值且字典中没有键,则会引发KeyError。” - Mike B

15
你可以使用dict.pop方法并忽略结果:
for key in [None, '']:
    d.pop(key, None)

3
以下代码将删除指定的键,如果存在的话,并且不会抛出错误:
for d in [None, '']:
    if d in my_dict:
        del my_dict[d]

@ozgurv:检查一个字典中是否存在一个键是O(1)的,从一个字典中删除一个键也是O(1)的。但是这将导致您进行两次查询而不是一次。 - Ben
@ozgurv 不,不是这样的。查看有关数据结构的Python文档上的时间复杂度。你也没在那里寻找摊销情况下的键。 - Jeff Tratner
@ozgurv my_sexy_dict.keys() 不是 O(1),因为它首先生成一个列表(或在 Python 中称为“视图”)。k in my_sexy_dict 是 O(1)。 - Jeff Tratner
1
在Python 3中,dict.keys不再返回列表,因此它们实际上是相同的,就像它们应该一样。 - jamylak
2
@jamylak,你说得没错,我从来没有理解为什么它返回一个列表而不是一个集合。 - Ozgur Vatansever
显示剩余3条评论

3
您可以尝试:
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 )

你正在创建一种不必要的中间列表推导式。如果你将它们去除,更高效的生成器将会被使用。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接