Use .extend代替.append
用于将列表合并在一起。
>>> example = [1, 2, 3]
>>> example.append([4, 5])
>>> example
[1, 2, 3, [4, 5]]
>>> example.extend([6, 7])
>>> example
[1, 2, 3, [4, 5], 6, 7]
此外,您可以循环遍历两者的键和值a
and b
一起使用itertools.chain:
from itertools import chain
all = {}
for k, v in chain(a.iteritems(), b.iteritems()):
all.setdefault(k, []).extend(v)
.setdefault()查找一个键,如果尚不存在则将其设置为默认值。或者你可以使用collections.defaultdict隐式地做同样的事情。
outputs:
>>> a
{1: [(1, 1)], 2: [(2, 2), (3, 3)], 3: [(4, 4)]}
>>> b
{3: [(5,5)], 4: [(6,6)]}
>>> all
{1: [(1, 1)], 2: [(2, 2), (3, 3)], 3: [(4, 4), (5, 5)], 4: [(6, 6)]}
请注意,因为我们现在首先为每个键创建一个干净的新列表,然后扩展您的原始列表a
不受影响。在您的代码中,您不会创建列表的副本;而是创建列表的副本。相反,你复制了参考列表。最终双方all
和a
dict 值指向相同的列表,并且在这些列表上使用追加会导致更改在两个位置都可见。
使用简单变量而不是字典很容易证明这一点:
>>> foo = [1, 2, 3]
>>> bar = foo
>>> bar
[1, 2, 3]
>>> bar.append(4)
>>> foo, bar
([1, 2, 3, 4], [1, 2, 3, 4])
>>> id(foo), id(bar)
(4477098392, 4477098392)
Both foo
and bar
参考同一个列表,该列表未被复制。要创建副本,请使用list()
构造函数或使用[:]
切片运算符:
>>> bar = foo[:]
>>> bar.append(5)
>>> foo, bar
([1, 2, 3, 4], [1, 2, 3, 4, 5])
>>> id(foo), id(bar)
(4477098392, 4477098536)
Now bar
是列表的新副本,并且更改不再可见foo
。内存地址(结果id()
调用)对于两个列表来说是不同的。