无法正确地为“扫雷”增加数组元素

问题描述:

我开始学习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,总列增加。

你的问题是

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