Python3 如何用最优雅的方式删除字典元素

Python 删除字典元素一般使用如下四种方式:

  • clear(): 删除字典内所有元素。

  • pop() :删除字典给定键 key 所对应的值,返回值为被删除的值。

  • popitem(): 随机返回并删除字典中的一对键和值。

  • del: 能删单一的元素也能清空字典,清空只需一项操作。

但这种方式并不优雅,这里就介绍一种非常优美的方式:

Python 2.7

>>> data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> map(data.pop, ['a', 'c'])
[1, 3]
>>> data
{'b': 2, 'd': 4}

但是我在 Python3 中却并没有删除掉。

>>> data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> map(data.pop, ['a', 'c'])

>>> data
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

为什么呢?

这是因为 Python2map 函数返回的是 list 对象,而 Python3map 函数返回的是一个迭代器。迭代器是惰性序列,需要调用才能执行,所以我们的 dict 元素 没有被 pop 掉,为了实现删除我们需要执行一次。

>>> data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> [value for value in map(data.pop, ['a', 'c'])]
[1, 3]
>>> data
{'b': 2, 'd': 4}

这样,就可以了!

但是!你以为就这样结束了吗?!!

。。。正片开始。。。

上述讲的方法存在这一个问题,就是如果字典里没有元素会怎么样?那就只能报错了。

如果我们在执行一次刚刚的代码:

>>> [value for value in map(data.pop, ['a', 'c'])]
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
KeyError: 'a'

那有没有避免报错的方式呢?

想什么呢?

当然有啦!

>>> [value for value in map(lambda index: data.pop(index) if data.get(index) else None, ['a', 'c'])]
[None, None]
>>> data
{'b': 2, 'd': 4} 

使用匿名函数和三元表达式(条件短路)即可!

这样你执行无限次都没有问题啦!

你可能感兴趣的:(#,Python,python,数据结构,dict)