如何复制列表字典及其复杂程度?我试图复制的字典是这样的:
myDict = { 'k1': ['a', 'b', 'c'],
'k2': ['d', 'e', 'f'],
'k3': ['g', 'h', 'i'] }
答案 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)
附近。