我有一本空字典。名称:dict_x 它有键,键的值是列表。

从单独的迭代中,我获得了一个键(例如:key_123)和一个项(一个元组),将其放入dict_x的值key_123的列表中。

如果这个键已经存在,我想追加这个项。 如果这个键不存在,我想用一个空列表创建它,然后附加到它,或者只是用一个元组创建它。

在未来,当这个键再次出现时,因为它存在,我希望再次追加该值。

我的代码由以下内容组成:

获取key和value。 查看dict_x中是否存在NOT键。 如果没有创建:dict_x[key] == [] 后来:dict_x(例子).append(值)

是这样做的吗?我应该尝试使用try/except块吗?


当前回答

博士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)
dictionary['key'] = dictionary.get('key', []) + list_to_append

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

博士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。

from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')

这比setdefault稍微有效一些,因为您不会创建您最终不使用的新列表。每次调用setdefault都会创建一个新列表,即使该项已经存在于字典中。