2016-02-25 28 views
5

私はPythonを初めて使いこなし、基本を学びます。リストについて疑問を持ってください。リスト内のリスト内の要素を変更する方法

は、リストを持っている:

L = [[1,2,3],[4,5,6],[3,4,6]] 

出力は次のようになります。

[[2,4,6],[8,10,12],[6,8,12]] 

私の作品のコードをそれが出力[[2,4,6],[8,10,12],[6,8,12]]を与える次

for x in range(len(L)): 
    for y in range(len(L[x])): 
     L[x][y] = L[x][y] + L[x][y] 
print L 

です。得られた出力は上記のコードでは

for x in L: 
    a = L.index(x) 
    for y in L[a]: 
     b = L[a].index(y) 
     L[a][b] = L[a][b] + L[a][b] 
print L 

[[4,2,6],[8,10,12],[12,8,6]] 

私は上記の出力についてデバッグしようとした

今、私は別のコードと同じ出力をしたいです。 aとbを印刷するために、"L[a][b] = L[a][b] + L[a][b]"行の上にprintステートメントを置きます。私はその後、ライン"L[a][b] = L[a][b] + L[a][b]"をコメントアウトした場合

0,0 
0,0 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,0 

再びaとbの値は予想通りです:

0,0 
0,1 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,2 

が、私はこれかもしれないと疑う私はあるとbの値を見て驚きましたPythonの変数のスコープのために起こっているかもしれませんし、Pythonのスコープに関するいくつかの勉強をしようとしました。しかし、私はスコープや上記の質問に対して適切な答えを得ていませんでした。

+1

答えはあなたのあなたが 'Lを変更したら、インナー' for'ループの第二のループではかなり明白である[0] [0] 'を' 2'にしてから '2'のインデックスを探しますが、コードが不必要に複雑に思えます。元のコードより簡単なものを実現しようとしていますか? – Obsidian

答えて

0

他の人が説明したように、index関数を使用すると、検索対象の値が最初に検出されます。だから、最初の時間は、あなたが(最初の行の)ループだを通じて、それが簡単に、より決定論的な方法でインデックスを取得するための

b = 1 
[1,2,3].find(1) # returns index 0 
#Then you modify the first element of the list 
b = 2 
[2,2,3].find(2) #returns index 0 again! 

のように見える、あなたはリストにenumerate機能を使用することができます。リスト全体を移動する際にインデックスを返すイテレータが提供されます。

for rowInd, x in enumerate(L): 
    for colInd, y in enumerate(x): 
     L[rowInd][colInd] = y + y 

元の解決策と同じように、これが実行されることに注意してください。

L = [2,4]、[6]、[8、10、12]、[6、8、12]

+0

これを解決する方法をありがとう。 –

+0

チャンスが得られたら必ず回答を選択してください。 –

0

ご所望の出力を達成するための最良の方法は、list comprehensionを使用することです。あなたのリスト内の各sublist以上

L = [[1,2,3], [4,5,6], [3,4,6]] 
answer = [[2*el for el in sublist] for sublist in L] 
print(answer) 

出力

[[2, 4, 6], [8, 10, 12], [6, 8, 12]] 

この繰り返し処理Lをし、所望の結果を達成、2によりsublistに各elを乗算:次のように行うことができます。

+1

彼は実用的な解決策を持っています。問題は、なぜ2番目の解決策が*機能しなかったのかということでした。 – zondo

+1

また、これはリストのコピーを作成し、オペレーションの元の試みはそれを適所で行うことでした。 –

1

あなたは声明であなたのリストを変更する - L[a][b] = L[a][b] + L[a][b] 例えば -

L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]] 

L[0][0] = 1は最初 は次に、Lのように変更[0] [0] =次のループにおいて2

L = [[2, 2, 3], [4, 5, 6], [3, 4, 6]] 

あなたは、今0,0である2のインデックスを検索しますので修正リストL. あなたの例では、と一緒にLを印刷しようとしました。結果は行動を説明 -

0 0 
[[1, 2, 3], [4, 5, 6], [3, 4, 6]] 
0 0 
[[2, 2, 3], [4, 5, 6], [3, 4, 6]] 
0 2 
[[4, 2, 3], [4, 5, 6], [3, 4, 6]] 
1 0 
[[4, 2, 6], [4, 5, 6], [3, 4, 6]] 
1 1 
[[4, 2, 6], [8, 5, 6], [3, 4, 6]] 
1 2 
[[4, 2, 6], [8, 10, 6], [3, 4, 6]] 
2 0 
[[4, 2, 6], [8, 10, 12], [3, 4, 6]] 
2 1 
[[4, 2, 6], [8, 10, 12], [6, 4, 6]] 
2 0 
[[4, 2, 6], [8, 10, 12], [6, 8, 6]] 
+0

説明をありがとう –

0

私は、次のコードは、Lでxの 良いかもしれないと思う:xのyについてORIGリスト 上#iterating:内側のリスト 上#iterating [X]

0

あなたの第二の方法を使用して主張する場合は、保存する必要があります一時変数に結果:

L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]] 
M = [[0 for y in range(3)] for x in range(3)] 
for x in L: 
    a = L.index(x) 
    for y in L[a]: 
     b = L[a].index(y) 
     M[a][b] = L[a][b] + L[a][b] 
L = M 
print L 

出力:

[[2, 4, 6], [8, 10, 12], [6, 8, 12]] 
関連する問題