2012-03-31 12 views
5

Pythonで2D配列を初期化する際に問題があります。私は6x6の配列が、私はPythonで2D配列を初期化する

arr = [[None]*6]*6 

をした。しかし、私が何時にしたい:私はちょうど1つのアイテムを設定し、そのすべての行の「複製された」

>>> arr[1][2]=10 
>>> arr 
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]] 

注意してください。どうしましたか?私はそれが同じリストを参照することと関係があると思いますが、これをどのように修正しますか?

私は

for key, _ in algos.items(): 
    algoData[key] = [] 
    for i in range(0,6): 
     algoData[key].append([]) 
     for j in range(0,6): 
      algoData[key][i].append(None) 

作品を考え出したが、ちょうど私が10000x10000配列をしたい場合、それは非常に非効率的であるもの、空の6x6の配列を、初期化するために長いと思われますか?

UPDATE

は、私はまた、2Dアレイの辞書を初期化することはできますか?私は以下のような辞書を初期化したい

algos = { "FIFO": ..., "LRU": ..., "Random": ... } 

:私のような辞書持っ

リストの内包表記を使用して
algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr } 

答えて

14

を、あなたが言うことができます。

arr = [[None for x in range(6)] for y in range(6)] 

次にあなたがarr[1][2] = 10作業を持っています予想通り。しかしこれはあまり普通のことではありません。ネストされたリストを使用する予定はありますか?より良い方法があるかもしれません。たとえば、numpyパッケージでは配列の操作がはるかに簡単になります。

+0

matplotlib(3Dサーフェスプロット)で使用するデータを保存したい –

+3

その場合、numpyをお勧めします。サンプルを見たい場合は、[this example](http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html)で使用されています。あなた自身の仕事を保存します。それは素晴らしいパッケージです。 – Cameron

+0

私が必要とする行は 'lineData = np.empty((dims、length))'だけでしょうか? –

15

@CameronはNumPyを使用して数値データの配列を処理することを示唆しています。そして、あなたの質問の第二の部分については、〜Niklas B.はdefaultdictを使用するように彼の提案にスポットを当てています。

なぜ[[None]*6]*6が奇妙に動作するのですか。

答えは(あなたが期待するように)[None]*6はそれで6つのNone sのリストを作成しますが、listの6つの独立したコピーが[list]*6せないということである - それは同じlistから参照の6つのコピーを作成します。

慣用のPythonには、これより良い説明ができるセクションがあります:"Other languages have variables - Python has names"