是否有一种在不引发 KeyError
的情况下从字典中删除键的单行方法?
if 'key' in my_dict:
del my_dict['key']
要删除某个键(无论它是否在字典中),请使用 dict.pop()
的两个参数形式:
my_dict.pop('key', None)
如果字典中存在 key
,则返回 my_dict[key]
,否则返回 None
。如果未指定第二个参数(即 my_dict.pop('key')
)且 key
不存在,则引发 KeyError
。
要删除保证存在的键,您还可以使用:
del my_dict['key']
如果键不在字典中,这将引发 KeyError
。
具体回答“有没有一种方法可以做到这一点?”
if 'key' in my_dict: del my_dict['key']
...好吧,你问了;-)
不过,您应该考虑,这种从 dict
中删除对象的方式是 not atomic — 'key'
可能在 if
语句期间位于 my_dict
中,但可能在 del
之前被删除} 被执行,在这种情况下 del
将失败并返回 KeyError
。鉴于此,使用 use dict.pop
或类似的东西是最安全的
try:
del my_dict['key']
except KeyError:
pass
当然,这绝对不是单行的。
pop
绝对更简洁,尽管这样做有一个关键优势:立即清楚它在做什么。
try/except
语句更昂贵。引发异常很慢。
try
会稍微快一些,但如果不存在,try
确实会慢很多。 pop
相当一致,但比使用不存在键的 try
慢。请参阅gist.github.com/zigg/6280653。最终,这取决于您期望密钥实际出现在字典中的频率,以及您是否需要原子性——当然,还取决于您是否进行过早优化;)
if 'key' in mydict: #then del...
。我需要从字典中提取一个键/值来正确解析,pop 不是一个完美的解决方案。
我花了一些时间才弄清楚 my_dict.pop("key", None)
到底在做什么。因此,我将添加此作为答案以节省其他人的谷歌搜索时间:
pop(key[, default]) 如果 key 在字典中,删除它并返回它的值,否则返回默认值。如果未给出默认值且 key 不在字典中,则会引发 KeyError。
dict.pop?
。
del my_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
但是当密钥不存在时,if key in 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
del
和 pop
之间的区别)
如果您需要在一行代码中从字典中删除很多键,我认为使用 map() 非常简洁且 Python 可读:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
如果您需要捕获弹出不在字典中的值的错误,请在 map() 中使用 lambda,如下所示:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
或在 python3
中,您必须改用列表推导:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
有用。即使 myDict 没有“e”键,“e”也不会导致错误。
map
和朋友现在很懒惰并返回迭代器。将 map
用于副作用通常被认为是不好的做法;标准的 for ... in
循环会更好。有关详细信息,请参阅 Views And Iterators Instead Of Lists。
[myDict.pop(i, None) for i in ['a', 'c']]
中仍然可以工作,因为它们提供了 map
(和 filter
)的一般替代方案。
for ... in
循环。
map()
相关,因为它的副作用经常被使用。 Python 中推荐的替代方法是 列表推导式,在我看来,它仍然是非常易读的,并且作为单行代码在认知上很轻(参见问题)。仅用于它们的副作用,这两种结构确实会导致一个无用的列表,这可能是低效的。从 Python3 开始,我不知道有一个内置函数可以安全、优雅地遍历生成器表达式,而没有代价高昂的副产品,例如 loop(d.pop(k) for k in ['a', 'b'])
。
for k in ['a', 'b']: d.pop(k)
。为什么你需要一种不同的方式来做到这一点?如果您需要它只占用一行那么严重,那么您可以将 for 循环的第二部分放在同一行上。
您可以使用 dictionary comprehension 创建一个删除该键的新字典:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
可以按条件删除。如果 key
不存在,则不会出错。
del dict[key]
或 dict.pop(key)
在所有情况下都会更快。
del
和 pop
更快,但有时您只是不想修改原始字典。如果在上面的示例中,将理解结果分配给另一个变量会更有意义。
使用“del”关键字:
del dict[key]
我们可以通过以下一些方法从 Python 字典中删除一个键。
使用 del
关键字;这与您所做的几乎相同 -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
或者
我们可以这样做:
但请记住,在此过程中,实际上它不会删除字典中的任何键,而是从该字典中排除特定键。此外,我观察到它返回的字典与 myDict
的排序不同。
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
如果我们在 shell 中运行它,它会执行类似 {'five': 500, 'four': 400, 'three': 300, 'two': 200}
的操作 - 请注意它与 myDict
的顺序不同。同样,如果我们尝试打印 myDict
,那么我们可以看到所有键,包括我们通过这种方法从字典中排除的键。但是,我们可以通过将以下语句分配给变量来创建一个新字典:
var = {key:value for key, value in myDict.items() if key != 'one'}
现在,如果我们尝试打印它,那么它将遵循父顺序:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
或者
使用 pop()
方法。
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
del
和 pop
的区别在于,使用 pop()
方法,如果需要,我们实际上可以存储 键的值,如下所示:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
Fork this gist 以供将来参考,如果您觉得这很有用。
if myDict.get('one')
检查密钥是否存在!如果 myDict['one'] 有一个错误的值,它会失败。此外,dicts 没有固有的顺序,因此提及它是没有意义的。
如果您想非常详细,可以使用异常处理:
try:
del dict[key]
except KeyError: pass
但是,如果密钥不存在,这将比 pop()
方法慢。
my_dict.pop('key', None)
几个键无关紧要,但如果你反复这样做,那么后一种方法是更好的选择。
最快的方法是这样的:
if 'key' in dict:
del myDict['key']
但是这种方法很危险,因为如果在两行之间删除 'key'
,则会引发 KeyError
。
字典 数据类型有一个名为 dict_name.pop(item)
的方法,可用于从字典中删除 key:value 对。
a={9:4,2:3,4:2,1:3}
a.pop(9)
print(a)
这将使输出为:
{2: 3, 4: 2, 1: 3}
这样,您可以在一行中从字典中删除一个项目。
另一种方法是使用 items() + dict理解。
items() 与dict理解相结合也可以帮助我们完成键值对删除的任务,但它的缺点是不是一个到位的dict技术。实际上,如果创建了一个新的字典,除了我们不希望包含的键。
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}
只需创建您的字典的副本。
newMy_dict = my_dict.copy()
if 'key' in newMy_dict :
del newMy_dict['key']
这样,您可以控制异常。
我更喜欢不可变的版本
foo = {
1:1,
2:2,
3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
return {
k:v
for k,v in dct.items() if k not in keyIter
}
>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}
按键上的单个过滤器
如果 my_dict 中存在“key”,则返回“key”并将其从 my_dict 中删除
如果 my_dict 中不存在“key”,则返回 None
这将改变 my_dict 到位(可变)
my_dict.pop('key', None)
键上的多个过滤器
生成一个新的字典(不可变)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)
您还可以将 filter
与 lambda
一起使用:
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> dict(filter(lambda x: x[0] != 'a', d.items()))
{'b': 2, 'c': 3}
>>>
my_dict.pop('key', None)
是最好的答案
尝试这个
if key in data:
del data[key]
pop()
而不是del
的优势:它返回该键的值。这样,您可以在一行代码中从字典中获取和删除条目。try
/except
解决方案快得多。您可能会发现其中一个或另一个更易于阅读,这很好。两者都是惯用的 Python,因此请选择您喜欢的任何内容。但是声称这个答案更复杂或更低效是没有意义的。self
,所以如果这个方法返回,那就太令人惊讶了。