有没有一种从字典中删除键而不引发KeyError的单行方法?
if 'key' in my_dict:
del my_dict['key']
有没有一种从字典中删除键而不引发KeyError的单行方法?
if 'key' in my_dict:
del my_dict['key']
当前回答
特别是回答“是否有一种单行方式可以做到这一点?”
if 'key' in my_dict: del my_dict['key']
……嗯,你问;-)
但是,您应该考虑,从dict中删除对象的这种方式不是原子的。在if语句期间,“key”可能在my_dict中,但可能在执行del之前被删除,在这种情况下,del将失败,并出现KeyError。鉴于此,使用dict.pop或类似于
try:
del my_dict['key']
except KeyError:
pass
当然,这绝对不是一句话。
其他回答
我花了一些时间才弄清楚my_dict.pop(“key”,“None”)到底在做什么。因此,我将添加以下内容作为答案,以节省其他人的搜索时间:
pop(键[,默认值])如果键在字典中,请删除它并返回其值,否则返回默认值。如果未给定默认值,且密钥不在字典,则会引发KeyError。
文档
特别是回答“是否有一种单行方式可以做到这一点?”
if 'key' in my_dict: del my_dict['key']
……嗯,你问;-)
但是,您应该考虑,从dict中删除对象的这种方式不是原子的。在if语句期间,“key”可能在my_dict中,但可能在执行del之前被删除,在这种情况下,del将失败,并出现KeyError。鉴于此,使用dict.pop或类似于
try:
del my_dict['key']
except KeyError:
pass
当然,这绝对不是一句话。
另一种方法是使用items()+dict理解。
items()加上dict理解也可以帮助我们完成键值对删除的任务,但它有一个缺点,即不是一种就地dict技术。实际上,如果创建了一个新的dict,除了我们不希望包含的key。
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
输出:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
您可以使用字典理解创建一个新的字典,并删除该键:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
您可以按条件删除。如果密钥不存在,则无错误。
delmy_dict[key]比my_dict.pop(key)稍快,用于在键存在时从字典中删除键
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
但是当键不存在时,如果my_dict:del my_dict[key]中的键比my_dict.pop(key,None)稍快。在try/except语句中,两者都至少比del快三倍:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133