6

我如何复制列表字典,它的复杂性是什么?我试图复制的字典是这样的:

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

3 回答 3

11
from copy import deepcopy
myCopy = deepcopy(myDict)

deepcopy总是这样

于 2013-01-07T21:35:30.190 回答
7

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

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

假设你有一个dictN 个键/值对,每个值是list一个平均 M 个元素。

如果lists 是简单值,则需要分配 1 个哈希表,并执行 2N+1 个简单副本和可能的 N 个哈希。s 是不可变的string,而且它们的长度都是 1,如果不是,Python 会将散列值缓存在大字符串中。所以,我们有 O(N) 的总操作。

lists 不是简单的值。您需要分配一个新列表并复制M元素。这需要 O(M) 时间。因为有 N 个,所以是 O(NM)。

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

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

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

于 2013-01-07T21:45:21.667 回答
-1

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

例子:

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

如果你改变a不会b改变。

并且复杂度是near O(1),因为字典使用hash表来存储数据,访问它的数据是near O(1),那么对于列表来说,访问数据和内存过程都是常数时间。所以它是near O(1)

于 2013-01-07T21:51:05.400 回答