我如何复制列表字典,它的复杂性是什么?我试图复制的字典是这样的:
myDict = { 'k1': ['a', 'b', 'c'],
'k2': ['d', 'e', 'f'],
'k3': ['g', 'h', 'i'] }
我如何复制列表字典,它的复杂性是什么?我试图复制的字典是这样的:
myDict = { 'k1': ['a', 'b', 'c'],
'k2': ['d', 'e', 'f'],
'k3': ['g', 'h', 'i'] }
from copy import deepcopy
myCopy = deepcopy(myDict)
deepcopy
总是这样。
复制任何复杂数据结构的最简单方法是copy.deepcopy
. (如果您正在考虑自己做,请参阅来源以了解所涉及的内容。)
复杂度显然应该是 O(NM),其中 N 是dict
条目数,M 是平均list
条目数。但是让我们来解决它:
假设你有一个dict
N 个键/值对,每个值是list
一个平均 M 个元素。
如果list
s 是简单值,则需要分配 1 个哈希表,并执行 2N+1 个简单副本和可能的 N 个哈希。s 是不可变的string
,而且它们的长度都是 1,如果不是,Python 会将散列值缓存在大字符串中。所以,我们有 O(N) 的总操作。
但list
s 不是简单的值。您需要分配一个新列表并复制M
元素。这需要 O(M) 时间。因为有 N 个,所以是 O(NM)。
因此,总时间为 O(N + NM) = O(NM)。
而且,鉴于您有 NM 对象并且明确地想要复制所有这些对象,您真的没有办法打败它。
当然,您可以通过剥离无关部分deepcopy
并将剩余的任何紧密循环移植到 Cython 或 C中来获得一个数量级的改进。
您可以使用调用的内部字典方法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)
。