关于字典:Python:如何在dict中扩展列表存储的内容?

Python: How to extend the content of a list store in a dict?

本问题已经有最佳答案,请猛点这里访问。

我正面临着一个非常简单和奇怪的Python问题。

我有一个带有几个键的字典,其中包含空列表。
我想追加/扩展特定键列表的内容。
因此我认为的代码看起来像这样

1
2
d = dict.fromkeys(['A','B','C'],[])
d['A'].append('Hello')

但是,结果并不是我所期望的。
每个键的值是一个包含一个元素的列表:'Hello'

1
2
>>> d
{'A': ['Hello'], 'C': ['Hello'], 'B': ['Hello']}

如果我尝试下面的内容,它会产生同样的结果

1
d.get('A').append('Bye')

我必须做什么操作才能获得这个?

1
2
>>> d
{'A': ['Hello'], 'C': [], 'B': []}

有人能解释我的语法出了什么问题吗?


你的语法很好,但你一遍又一遍地使用相同的列表。 由于列表是可变的,当你append时,你将'Hello'添加到同一个列表中,这恰好在三个地方被引用。 您可能想要做的是更多地手动创建dict:

1
d = {k:[] for k in ['A', 'B', 'C']}

(以上是Python 2.7或更高版本。对于较旧的Python,您可以使用:dict((k,[]) for k in ['A', 'B', 'C']))


你正在创建一个字典,其所有值都引用同一个实例[],就像@A?wini?haudhary所提到的那样。
您可能想要使用defaultdict

1
2
3
4
5
6
7
8
9
10
11
In [150]: from collections import defaultdict

In [151]: d = defaultdict(list)

In [152]: d['A'].append('Hello')

In [153]: d
Out[153]: defaultdict(<type 'list'>, {'A': ['Hello']})

In [154]: print d['B']
[]