如何创建键或者将元素附加到键?
- 2025-03-04 08:23:00
- admin 原创
- 89
问题描述:
我有一本空字典。名称:dict_x
它有键,键值为列表。
从单独的迭代中,我获得一个键(例如key_123
:)和一个项(一个元组)以放置在dict_x
值列表中key_123
。
如果此键已存在,我想附加此项。如果此键不存在,我想用一个空列表创建它,然后附加到它,或者只是用其中的元组创建它。
将来当这个键再次出现时,因为它存在,所以我希望再次附加该值。
我的代码包括以下内容:
获取密钥和值。
检查 中是否存在NOT键
dict_x
。如果没有,则创建:
dict_x[key] == []
然后:
dict_x[key].append(value)
这是可行的方法吗?我应该尝试使用try/except
块吗?
解决方案 1:
使用dict.setdefault()
:
dict.setdefault(key,[]).append(value)
帮助(dict.setdefault):
setdefault(...)
D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
解决方案 2:
以下是各种实现方法,您可以比较它们的外观并选择您喜欢的。我以我认为最“pythonic”的方式对它们进行了排序,并评论了乍一看可能不明显的优缺点:
使用collections.defaultdict
:
import collections
dict_x = collections.defaultdict(list)
...
dict_x[key].append(value)
优点:可能性能最佳。缺点:在 Python 2.4.x 中不可用。
使用dict().setdefault()
:
dict_x = {}
...
dict_x.setdefault(key, []).append(value)
缺点:创建未使用的list()
s 效率低下。
使用try ... except
:
dict_x = {}
...
try:
values = dict_x[key]
except KeyError:
values = dict_x[key] = []
values.append(value)
或者:
try:
dict_x[key].append(value)
except KeyError:
dict_x[key] = [value]
解决方案 3:
您可以为此使用默认字典。
from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')
这比 稍微高效一些,setdefault
因为你不会创建最终不使用的新列表。每次调用setdefault
都会创建一个新列表,即使该项目已经存在于字典中。
解决方案 4:
您可以在中使用defaultdictcollections
。
来自文档的一个例子:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
解决方案 5:
dictionary['key'] = dictionary.get('key', []) + list_to_append
解决方案 6:
总结
更长更富有表现力的方法似乎也更有效。
if key in dest:
dest[key].append(value)
else:
dest[key] = [value]
较长的答案
我写了一些 python 代码来检查所提出的方法在性能方面是否确实是最好的。
d1 = {}
d2 = {}
def add1(key, value, dest):
dest.setdefault(key, []).append(value)
def add2(key, value, dest):
if key in dest:
dest[key].append(value)
else:
dest[key] = [value]
这导致
%timeit add1('a', 1.1, d1)
96.2 ns ± 0.0972 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
%timeit add2('a', 1.1, d2)
89.1 ns ± 0.111 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
在我的 Python 设置 ( 3.10.4 (main, Apr 2 2022, 09:04:19) [GCC 11.2.0]
) 上测试了执行 Jupyter NB。
值得指出的是,在这种情况下,选择更长、更具表现力的方法也会对性能产生积极影响。
解决方案 7:
死灵发布:
如果默认情况下只有一个键应该是数组,那么这defaultdict
可能是过度的/不想要的,并且以后会导致奇怪的错误。
建议的替代方案:在开头添加一个空键,如果结尾仍然为空,则将其删除。
喜欢:
d[key] = []
if condition:
d[key].append(value)
# remove if still empty:
if not d[key]:
del d[key]
非常冗长,但没有以任何其他方式触及字典......
扫码咨询,免费领取项目管理大礼包!