Ton*_*ony 1539 python dictionary unset data-structures
当我试图从字典中删除一个键时,我写道:
if 'key' in myDict:
del myDict['key']
Run Code Online (Sandbox Code Playgroud)
有这样一种方式吗?
Sve*_*ach 2515
用途dict.pop():
my_dict.pop('key', None)
Run Code Online (Sandbox Code Playgroud)
my_dict[key]如果key字典中存在,则返回,None否则返回.如果未指定第二个参数(即.my_dict.pop('key'))key且不存在,KeyError则引发a.
zig*_*igg 336
特别回答"有这样一种方式吗?"
if 'key' in myDict: del myDict['key']
Run Code Online (Sandbox Code Playgroud)
......好吧,你问 ;-)
你应该考虑,虽然,从删除对象的这种方式dict是不是原子 -它是可能的,'key'可能是在myDict该过程中if的语句,但是可以删除之前del被执行,在这种情况下del将失败,KeyError.鉴于此,无论是使用dict.pop还是其他方面都是最安全的
try:
del myDict['key']
except KeyError:
pass
Run Code Online (Sandbox Code Playgroud)
当然,这绝对不是一个单行.
Aka*_*all 136
我花了一些时间来弄清楚到底my_dict.pop("key", None)在做什么.所以我将这个作为一个答案,以节省其他人的谷歌搜索时间:
pop(key [,default])
如果key在字典中,则将其删除并返回其值,否则返回default.如果未给出default并且key不在字典中,则引发KeyError
Pet*_*mit 45
上述三种解决方案的时间安排.
小字典:
>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063
Run Code Online (Sandbox Code Playgroud)
较大的字典:
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532
Run Code Online (Sandbox Code Playgroud)
Mar*_*ter 40
如果你需要在一行代码中从字典中删除很多键,我认为使用map()非常简洁,Pythonic可读:
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}
Run Code Online (Sandbox Code Playgroud)
如果您需要在弹出不在字典中的值的地方捕获错误,请在map()中使用lambda,如下所示:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
Run Code Online (Sandbox Code Playgroud)
有用.即使myDict没有'e'键,'e'也不会导致错误.
Sha*_*eem 16
使用:
>>> if myDict.get(key): myDict.pop(key)
Run Code Online (Sandbox Code Playgroud)
其他方式:
>>> {k:v for k, v in myDict.items() if k != 'key'}
Run Code Online (Sandbox Code Playgroud)
您可以按条件删除.如果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}
Run Code Online (Sandbox Code Playgroud)
要么
我们可以这样做:
但是应该记住,在这个过程中实际上它不会从字典中删除任何键,而不是从该字典中排除特定键.另外,我观察到它返回了一个字典,它没有被命令相同myDict.
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
Run Code Online (Sandbox Code Playgroud)
如果我们在shell中运行它,它将执行类似的操作{'five': 500, 'four': 400, 'three': 300, 'two': 200}- 注意它与它的顺序不同myDict.再次,如果我们尝试打印myDict,那么我们可以看到所有键,包括我们通过这种方法排除在字典中.但是,我们可以通过将以下语句分配给变量来创建新字典:
var = {key:value for key, value in myDict.items() if key != 'one'}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们尝试打印它,那么它将遵循父订单:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
Run Code Online (Sandbox Code Playgroud)
要么
使用pop()方法.
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
叉这个要点以供将来参考,如果你发现这很有用.
如果您想非常冗长,可以使用异常处理:
try:
del dict[key]
except KeyError: pass
Run Code Online (Sandbox Code Playgroud)
但是,pop()如果密钥不存在,这比方法慢。
my_dict.pop('key', None)
Run Code Online (Sandbox Code Playgroud)
几个键无关紧要,但如果您重复执行此操作,则后一种方法是更好的选择。
最快的方法是这样的:
if 'key' in dict:
del myDict['key']
Run Code Online (Sandbox Code Playgroud)
但是这种方法是危险的,因为如果'key'在两行之间删除,aKeyError将被提出。
我更喜欢不可变的版本
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}
Run Code Online (Sandbox Code Playgroud)
小智 6
另一种方法是使用 items() + dict 理解。
\nitems() 与 dict 理解相结合也可以帮助我们实现键值对删除的任务,但它的缺点是不是就地 dict 技术。实际上,如果创建了一个新的字典,除了我们不希望包含的键\xe2\x80\x99。
\ntest_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}\n\n# Printing dictionary before removal\nprint ("dictionary before performing remove is : " + str(test_dict))\n\n# Using items() + dict comprehension to remove a dict. pair\n# removes vinod\nnew_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}\n\n# Printing dictionary after removal\nprint ("dictionary after remove is : " + str(new_dict))\nRun Code Online (Sandbox Code Playgroud)\n输出:
\ndictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}\ndictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}\nRun Code Online (Sandbox Code Playgroud)\n
字典数据类型有一个被调用的方法dict_name.pop(item),它可以用来从字典中删除一个键:值对。
a={9:4,2:3,4:2,1:3}
a.pop(9)
print(a)
Run Code Online (Sandbox Code Playgroud)
这将使输出为:
{2: 3, 4: 2, 1: 3}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以在一行中从字典中删除一个项目。