我有一本空字典。名称:dict_x
它有键,键的值是列表。
从单独的迭代中,我获得了一个键(例如:key_123)和一个项(一个元组),将其放入dict_x的值key_123的列表中。
如果这个键已经存在,我想追加这个项。
如果这个键不存在,我想用一个空列表创建它,然后附加到它,或者只是用一个元组创建它。
在未来,当这个键再次出现时,因为它存在,我希望再次追加该值。
我的代码由以下内容组成:
获取key和value。
查看dict_x中是否存在NOT键。
如果没有创建:dict_x[key] == []
后来:dict_x(例子).append(值)
是这样做的吗?我应该尝试使用try/except块吗?
您可以在集合中使用defaultdict。
一个来自doc的例子:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
这里有各种不同的方法来做到这一点,这样你可以比较它的外观,并选择你喜欢的。我以我认为最“python化”的方式对它们进行了排序,并评论了乍一看可能不太明显的优点和缺点:
使用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)
缺点:低效地创建未使用的列表()。
使用try…除了:
dict_x = {}
...
try:
values = dict_x[key]
except KeyError:
values = dict_x[key] = []
values.append(value)
Or:
try:
dict_x[key].append(value)
except KeyError:
dict_x[key] = [value]
博士TL;
更冗长和更有表现力的方法似乎也更有性能。
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。
值得指出的是,在这种情况下,选择更长的和更有表现力的方法也可以对性能产生积极影响。
您可以在集合中使用defaultdict。
一个来自doc的例子:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)