2017-06-28 6 views
0

オブジェクトの参照をあるリストから別のリストに移動する(オブジェクトをあるリストから別のリストに移動する)には、どのような方法が最適でしょうか。明確にするために、私は辞書のユースケースを不明瞭に追加オブジェクトの浅いコピーリスト

class MyObject: 
    def __init__(self,v): 
     self.value = v 

d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []} 

#which one? 
#d[2] = [obj for obj in d[1]] 

#d[2] = d[1][:] 

#d[2] = d[1].copy() 

#clear d[1] 
#d[1] = [] 

for i in range(len(d[1])): 
    d[2].append(d[1].pop(0)) 

for o in d[2]: 
    print (o.value) 
+0

*「ベスト」*どうやって、正確に?前のリストを破壊するかどうかは重要ですか(あなたの提案の中には、そうでないものもあればそうでないものもあります)。そして、なぜただ一つを選んで、他の何かにあなたの時間を費やすのはなぜより便利ですか? – jonrsharpe

+0

[リストを複製またはコピーするにはどうすればいいですか?](https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list) – victor

+0

*「人」*は何ですか?彼らが好むものを*求めてみてはどうでしょうか?もっと実用的なものがあれば、[codereview.se]を使用してください。 – jonrsharpe

答えて

3

どちらのアプローチが最適なのは、周囲のコードの詳細に少し依存します。他の変数やデータ構造にもあなたのリストのいずれかへの参照が含まれていますか?既存のリストへの他の参照が存在するかもしれないと、あなたは彼らが正しい値を参照続行する場合

d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []} 
d[2] = d[1] 
d[1] = [] 

:いない場合は、あなただけ(何のコピーは行われませんので、O(1)時間がかかります)辞書内の参照を再バインドすることができます私は正当な理由がないと思う

d[2][:] = d[1] # copy data 
d[1].clear() 

:(例えばd[1]古い参照はまだ変化した後d[1]を参照する必要があります)、あなたは明らかに続いて、スライスの割り当てを(これはO(N)で)やりたいですあなたが他のロジックを適用しない限り、他のアプローチを使用することができます(いくつかの値だけをコピーし、他の値はコピーしたくない場合など)。

1

をコピーした後d[1]からオブジェクトを削除する必要があります。あなたの例に基づいて、オブジェクトのコピーまたは同じオブジェクトを参照するリストが必要かどうかは明らかではありません。

後者を仮定すると、単純化されたケースを考慮する。それは本当に別の変数にリストを割り当てるのと同じくらい簡単です:

>>> class MyObject(object): 
...  def __init__(self, v): 
...   self.value = v 
... 
>>> x = [MyObject(1), MyObject(2)] 
>>> y = x 
>>> x[1].value 
2 

は今、xyの両方が同じ参照しているオブジェクトのリストです。私は1つのリストにオブジェクトを変更した場合、それは他に変更されます:あなたのユースケース(リストの値を持つ辞書)で

>>> y[1].value = 3 
>>> x[1].value 
3 

を、これは非常に簡単です:

d[2] = d[1] 

あなたが、その後することができます必要に応じて1キーを削除してください。

del d[1] 

Voila!

関連する問題