我有这种列表字典,最初是空的:
d = dict()
Run Code Online (Sandbox Code Playgroud)
现在的用例是简单地在键下添加一个值,该键可能是新键或现有键.我想我们必须这样做:
if key not in d:
d[key] = list()
d[key].append(value)
Run Code Online (Sandbox Code Playgroud)
这看起来非常繁琐且容易出错,需要编写多行(使用复制粘贴或辅助函数).有更方便的方式吗?
如果没有"只有一种方法可以做到这一点",并且你知道它,你也可以回答这个问题,也许可以建议其他方法来完成上述工作,即使它们不一定更好.
我找了重复,没找到,但也许我只是不知道使用正确的关键字.
d[key] = d.get(key, []) + [value]
解释
d.get方法返回键下的值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]}
Run Code Online (Sandbox Code Playgroud)
你想要的是一个defaultdict,在集合库中可用:
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])]
Run Code Online (Sandbox Code Playgroud)