202

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

从单独的迭代中,我获得了一个键(例如:)key_123和一个项目(一个元组)以放置在dict_x's value的列表中key_123

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

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

我的代码包括:

获取键和值。

查看NOT键是否存在于dict_x.

如果不创建它:dict_x[key] == []

然后:dict_x[key].append(value)

这是这样做的方法吗?我应该尝试使用try/except积木吗?

4

5 回答 5

339

使用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
于 2012-10-16T00:43:35.667 回答
85

以下是执行此操作的各种方法,因此您可以比较它的外观并选择您喜欢的。我以我认为最“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]
于 2012-10-16T01:19:57.823 回答
33

您可以为此使用defaultdict 。

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

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

于 2012-10-16T00:47:24.243 回答
16

您可以.collections

来自文档的示例:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)
于 2012-10-16T00:45:42.793 回答
10
dictionary['key'] = dictionary.get('key', []) + list_to_append
于 2020-07-02T18:12:39.780 回答