无法正确地为“扫雷”增加数组元素
问题描述:
我开始学习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]]
不错,我要去添加一个空闲会话的例子,但雅打我给它 – Claudiu 2013-03-12 17:14:36
这似乎是正确的,感谢 – 2013-03-12 17:17:45
我玩这个了两个小时! – 2013-03-12 17:35:49