2016-07-17 9 views
0

私はNxNのリストをpythonで記入しようとしています。 2次元配列として見れば、最初に主対角線が塗りつぶされ、他の操作は他の要素で行われます(ここでは関係ありません)。たとえば、最初にdyn_arr=[[[], [], []], [[], [], []], [[], [], []]]がある場合は、最初に[[[1], [], []], [[], [1], []], [[], [], [1]]]に変わります。リストの完全な空リストを任意の順序で埋め込む

dyn_arr = [[[]]* N] * N 
idx_set = [] 
for pointer in range(N): 
    pointer_pair = [0, pointer] 
    while pointer_pair[0] < N and pointer_pair[1] < N: 
     if pointer_pair[0] == pointer_pair[1]: 
      dyn_arr[pointer_pair[0]][pointer_pair[1]]=[1] 
     pointer_pair[0] += 1 
     pointer_pair[1] += 1 

しかし、それは[[[1], [1], [1]], [[1], [1], [1]], [[1], [1], [1]]]を出力します。誰かが何が起こっているのか、私はそれをどのように修正すべきか説明してください。

+2

あなたがそれらのいずれかを変更するときに、あなたが実際にそれらのすべてを変更している、 'N'の回複製され、同一の参照(複数可)を持っています。 – Pythonista

+0

外部サイクルでポインタ_pair [1]を増やすのはなぜですか? – UpmostScarab

+0

@UpmostScarab、私は特定の順序で(斜めに)配列を埋めています。 – Cupitor

答えて

1

乗算演算子を使用してリストを作成するときは注意してください。この方法では参照をリスト内のオブジェクトに掛けます。それはコピーを作成しません!したがって、a = [[]] * 3を使用してリストのリストを作成すると、すべて同じ空の配列である3つの要素のリストが作成されます。

# instead of dyn_arr = [[[]]* N] * N use: 
dyn_arr = [ [ [] for _i in range(N) ] for _j in range(N) ] 

:あなたは常にリストの内包表記を使用して、リストのリストを作成する必要があります

a = [[]] * 3 
print a # prints "[[], [], []]" 
a[0].append(4) 
print a # prints "[[4], [4], [4]]" 
print a[0] is a[1] # prints "True" 

:外リストのすべての3つの要素で参照されている。この1と同じリストを変更します(.append()を使用して)、それを変更します結果は作成直後と同じように見えますが、このバージョンでは、追加の参照ではなく、各エントリの新しい配列が作成されます。

これは、元のエラーから生じる問題を解決するはずです。

0
import numpy as np 

N = 3 
z = np.zeros((N,N)) 
rng = np.arange(N) 
z[rng, rng] = 1 
print z 

私は、これは に役立ちます願っています:)

関連する問題