2013-03-12 61 views
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

你的問題是

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]] 
+0

不錯,我要去添加一個空閒會話的例子,但雅打我給它 – Claudiu 2013-03-12 17:14:36

+0

這似乎是正確的,感謝 – 2013-03-12 17:17:45

+0

我玩這個了兩個小時! – 2013-03-12 17:35:49