2

私はPythonを学び始めています。簡単な例から始めました。問題は、テーブルの各場所の近くにある地雷を数えることでした。以下の入力ファイルを検討してください。

4 4 
*... 
.... 
.*.. 
.... 
3 5 
**... 
..... 
.*... 
0 0 

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

Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100

そして私のコードは:

#!/usr/bin/python

import pprint

fin = open("1.2.in")
fout = open("1.2.out")

while True:
    i, j = [int(x) for x in fin.readline().split()]
    if(i == 0):
        break
    arr = []
    for k in range(0,i):
        line = fin.readline();
        arr.append(list(line))


    pprint.pprint(arr)
    resarr = [[0]*j]*i

    for row in range(0,i):
        for col in range(0,j):
            for rowIndex in range(-1,2):
                for colIndex in range(-1,2):


#                   print row,rowIndex, col,colIndex
                    if (row + rowIndex < i) and (row + rowIndex >= 0) and ( col + colIndex < j) and (col+colIndex >=0) and (rowIndex != 0 or colIndex != 0):
                        #pprint.pprint(resarr[row][col])
                        #if arr[row+rowIndex][col+colIndex] == "*":

                        #print row,rowIndex, col,colIndex, "              ", arr[row+rowIndex][col+colIndex] 
                        #print resarr[row][col]
                        resarr[row][col] += 1  
                        #pprint.pprint(resarr)
    #                   print col+colIndex
    print i,j
    pprint.pprint(resarr)

何が問題なのかわかりませんが、インクリメントしたい場合resarrは、合計列がインクリメントされます。

4

1 に答える 1

4

あなたの問題は

resarr = [[0]*j]*i

つまり、によって定義された同じiリストへの参照を取得し、それらのリストを作成します。[0]*j

あなたが欲しいものは:

resarr = [[0]*j for _ in range(i)]

これにより、代わりに新しいリスト([0, 0, ...]i回が作成されます。

これを参照してください:

>>> a = [0] * 4
>>> a
[0, 0, 0, 0]
>>> b = [a] * 4
>>> b
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> id(b[0])     # get the "address" of b[0]
42848200
>>> id(b[1])     # b[1] is the same object!
42848200
>>> b[0][0] = 1
>>> b
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
于 2013-03-12T17:11:57.230 に答える