从 Python 字典中弹出许多元素的最佳方法

问题描述 投票:0回答:8

这是我的代码:

a = dict(aa='aaaa', bb='bbbbb', cc='ccccc', ...)
print(a.pop(['cc', ...]))

但这会引发错误。 从 python 字典中弹出许多元素的最佳简单方法是什么?

python dictionary
8个回答
67
投票

简单一点怎么样:

for e in ['cc', 'dd',...]: 
  a.pop(e)

38
投票

使用列表理解:

a = {'key1':'value1','key2':'value2','key3':'value3'}
print [a.pop(key) for key in ['key1', 'key3']]

6
投票

如果我正确理解你想要什么,这应该可以解决问题:

print [a.pop(k) for k in ['cc', ...]]

但要小心,因为

pop
具有破坏性,即它会修改你的字典。


4
投票

我已经执行了基准测试:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
drop = ('a', 'b', 'x', 'y', 'z')

测试 1

d.pop(k, None)
。请注意第二个参数:它确保丢失的键不会失败

for key in drop:
    d.pop(key, None)

测试 2

if key in d: d.pop()
。这种额外条件会减慢速度还是提高
.pop()
的性能?

for key in drop:
    if key in d:
        d.pop(key)

测试 3:设置错误

bad = set(d) & set(drop)  # find bad keys to drop

for key in bad:
    del d[key]

测试 4:创建一个新的字典作为理解

d = {k: v for k, v in d.items() if k not in drop}

结果:

  • .pop(key, None)
    :4.37秒
  • if key in d: pop()
    :3.75秒
  • if key in set(bad): del d[key]
    :5.27秒
  • 理解力:7.2秒

结论:

  • 字典理解表现最差
  • del
    不太好
  • 两种
    .pop()
    解决方案都很好。不要担心额外的
    if
    :它实际上可以改善事情

最后,Python 仍然能够达到每秒 200 万次。别太担心:)


3
投票
a={'aa':'aaaa','bb':'bbbbb','cc':'ccccc'}
remove = ['aa', 'cc']
newA = dict([(k, v) for k,v in a.items() if k not in remove])

2
投票

这里有一个单行代码,适用于任意长字典,对于这种情况:

print([a.pop(key) for key in list(a.keys()) if key >= 'cc'])

举例说明:

a = dict(aa='aaaa', bb='bbbbb', cc='ccccc', dd='ddddd', ee='eeeee')
print([a.pop(key) for key in list(a.keys()) if key >= 'cc']) # => ['ccccc', 'ddddd', 'eeeee']
print(a) # => {'aa': 'aaaa', 'bb': 'bbbbb'}

注意:只要字典键“递增”,它就可以工作,如下所示:

aa
bb
cc
dd
ee
ff
,...


0
投票

没有人展示如何将弹出的对作为单独的

dict
进行减去。不是在问题中明确,但仍然回答了问题(如下所示),并且在单独的
dict
中捕获了弹出的键和值的附加值:

>>> a = dict(aa='aaaa', bb='bbbbb', cc='ccccc', dd='ddddd', ee='eeeee')
>>> subtracted = dict((key, a.pop(key)) for key in ['cc', 'dd'])

>>> a
{'aa': 'aaaa', 'bb': 'bbbbb', 'ee': 'eeeee'}

>>> print(subtracted)
{'cc': 'ccccc', 'dd': 'ddddd'}

>>> print(list(subtracted.values()))
['ccccc', 'ddddd']

-2
投票

your_dict.clear()
也可能是一个选择

© www.soinside.com 2019 - 2024. All rights reserved.