リストの辞書をコピーするにはどうすればよいですか? また、その複雑さは何ですか? 私がコピーしようとしている辞書は次のようなものです:
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 個の要素を持つとします。
s が単純な値の場合、list
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
変わらない。
辞書はハッシュテーブルを使用してデータを格納するため、複雑さは に近くO(1)
、そのデータへのアクセスは に近くO(1)
、リストの場合、データへのアクセスとメモリプロセスは一定時間であるため、 に近いO(1)
.