如何从Python字典中删除密钥?

时间:2012-06-30 20:27:59

标签: python dictionary unset

尝试从字典中删除密钥时,我写道:

if 'key' in myDict:
    del myDict['key']

有这样一种方法吗?

13 个答案:

答案 0 :(得分:2234)

使用dict.pop()

my_dict.pop('key', None)

如果字典中存在my_dict[key],则返回key,否则返回None。如果未指定第二个参数(即。my_dict.pop('key'))且key不存在,则会引发KeyError

答案 1 :(得分:310)

具体回答“有这样一种方式吗?”

if 'key' in myDict: del myDict['key']

......好吧,你; - )

但是,您应该考虑这种从dict删除对象的方法是not atomic - 'key'可能在myDict期间{ {1}}语句,但可能会在执行if之前删除,在这种情况下,del将失败并显示del。鉴于此,use dict.pop

之类的内容最安全
KeyError

当然,肯定是单行。

答案 2 :(得分:126)

花了一些时间才弄明白my_dict.pop("key", None)到底在做什么。所以我将这个作为一个答案,以节省其他人的谷歌搜索时间:

  

pop(键[,默认])

     

如果key在字典中,则删除它并返回其值,否则   返回默认值。如果未给出默认值且密钥不在   字典,引发KeyError

Documentation

答案 3 :(得分:36)

上述三种解决方案的时间安排。

del是从Python词典中删除密钥的最快方法

小字典:

>>> 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

较大的字典:

>>> 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

答案 4 :(得分:33)

如果你需要在一行代码中从字典中删除很多键,我认为使用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}

如果您需要在弹出不在字典中的值时捕获错误,请在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']]

有效。并且'e'没有导致错误,即使myDict没有'e'键。

答案 5 :(得分:17)

使用:

>>> if myDict.get(key): myDict.pop(key)

另一种方式:

>>> {k:v for k, v in myDict.items() if k != 'key'}

您可以按条件删除。如果key不存在,则无错误。

答案 6 :(得分:12)

使用" del"关键字:

del dict[key]

答案 7 :(得分:7)

我们可以通过以下几种方法从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}

delpop之间的区别在于,使用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以供将来参考,如果您觉得这很有用。

答案 8 :(得分:4)

词典数据类型具有一种称为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}

这样,您可以在一行中从字典中删除一项。

答案 9 :(得分:2)

按键上的单个过滤器

  • 如果my_dict中存在“ key”,请返回“ key”并将其从my_dict中删除
  • 如果my_dict中不存在“键”,则不返回

这将更改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()
            )
    )
)

答案 10 :(得分:1)

我更喜欢不变的版本

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}

答案 11 :(得分:1)

另一种方法是通过使用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}

答案 12 :(得分:0)

如果要非常冗长,可以使用异常处理:

try: 
    del dict[key]

except KeyError: pass

但是,如果键不存在,这比pop()方法要慢。

my_dict.pop('key', None)

几个键无关紧要,但是如果重复执行此操作,那么后一种方法是更好的选择。

最快的方法是这样:

if 'key' in dict: 
    del myDict['key']

但是此方法很危险,因为如果在两行之间删除'key',则会引发KeyError