如何复制列表字典?

时间:2013-01-07 21:27:33

标签: python dictionary deep-copy

如何复制列表字典及其复杂程度?我试图复制的字典是这样的:

myDict = { 'k1': ['a', 'b', 'c'], 
           'k2': ['d', 'e', 'f'], 
           'k3': ['g', 'h', 'i'] }

3 个答案:

答案 0 :(得分:10)

from copy import deepcopy
myCopy = deepcopy(myDict)

deepcopy始终是 方式。

答案 1 :(得分:7)

复制任何复杂数据结构的最简单方法是copy.deepcopy。 (如果您正在考虑自己动手,请参阅the source以了解所涉及的内容。)

复杂性显然应该是O(NM),其中N是dict条目的数量,M是list条目的平均数量。但是让我们来解决它:

假设您有dict个N键/值对,每个值为list,平均为M个元素。

如果list是简单值,则需要分配1个哈希表,并执行2N + 1个简单副本和可能的N个哈希值。 string是不可变的,无论如何它们都是长度为1,如果不是,Python会将哈希值缓存为大字符串。所以,我们已经完成了O(N)次操作。

list不是简单的值。您需要分配新列表并复制M元素。这需要O(M)时间。由于它们中有N个,那就是O(NM)。

因此,总时间为O(N + NM)= O(NM)。

而且,鉴于你有NM对象并明确想要复制所有这些对象,你真的没办法击败它。

当然,可以想象通过剥离deepcopy所做的无关部分并将任何紧密的循环移植到Cython或C中,可以获得一个数量级的改进。

答案 2 :(得分:0)

您可以使用名为copy()的内部字典方法复制字典:

示例:

a = {'s':[1,2,3], 'f':[5,4,2]}
b = a.copy()

如果您更改a,则b不会更改。

并且复杂性接近O(1),因为字典使用哈希表来存储数据,访问其数据的位置接近O(1),然后对于列表,访问数据和内存进程是恒定的时间。所以它在O(1)附近。