在Python中向字典列表添加值?

10

我有一个这样的字典列表,最初是空的:

d = dict()

现在的用例是将一个值添加到一个键下的列表中,这个键可能是新的也可能是已存在的。我认为我们需要像这样做:

现在的用例是将一个值添加到一个键下的列表中,这个键可能是新的也可能是已存在的。我认为我们需要像这样做:

if key not in d:
    d[key] = list()
d[key].append(value)

这似乎非常繁琐和容易出错,需要编写多行代码(使用复制粘贴或辅助函数)。有更方便的方法吗?

如果没有“只有一种正确的方法”,而你知道这一点,你也可以回答,并可能建议实现上述任务的替代方式,即使它们不一定更好。

我查找了重复内容,但没有找到,但也许我只是不知道使用正确的关键字。


2
使用 defaultdict - John Coleman
.setdefault 方法可以做这种事情。 - PM 2Ring
3个回答

15
你需要的是一个叫做"defaultdict"的东西,可以在collections库中找到:
Python2.7: https://docs.python.org/2/library/collections.html#defaultdict-examples Python3.7: https://docs.python.org/3/library/collections.html#collections.defaultdict
Example:
>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

11

d[key] = d.get(key, []) + [value]

解释:
d.get 方法返回key为 key 的value,如果不存在这个key,则返回可选的参数(第二个参数),在这种情况下返回 [] (空列表)

然后您将获得列表(可能为空),然后将列表[value]添加到其中。 这也可以通过.append(value)而不是+ [value]来完成。

有了该列表,您将其设置为该键的新值

例如:

d = {1: [1, 2]}
d[1] = d.get(1, []) + [3]
# d == {1: [1, 2, 3]}

d[17] = d.get(17, []) + [8]
# d == {1: [1, 2, 3], 17: [8]}

3
为什么不直接使用d.setdefault(key, []).append(value)呢? - user2390182
@schwobaseggl 那很好,但是只适用于可变类型,例如 dict(str:int) 就会失败。 - Superior

2
d[key] = list() if (key not in d) else d[key].append(value) 

使用三元运算符。看起来更简洁,但它仍然与您的情况几乎完全相同。
抱歉,我之前没有想清楚,使用了标准的三元运算符。我将它们改为了Python三元运算符。

Python没有?:运算符,对吧?不过有exp1 if cond else exp2语法,你可以用它来重写答案。 - hyde
@hyde,那是我的错。我使用了错误的三元运算符。 - Dylan
1
我认为这个不起作用,但是 d[key] = [value] if key not in d else d[key] + [value] 应该能够正确覆盖两种情况。 - hyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接