问题描述
#下面的程序检查二维数组中的单词并返回单词索引的嵌套列表。该算法检查水平方向(左和右)、垂直方向(上下)和对角线(左)的单词向右向下) **我面临的问题** #程序为某些词返回正确的索引,但对于某些词它返回none。对于某些词,程序崩溃并给出索引错误(列表索引超出范围) 代码
def find(word):
new_list=[]
print("lenght",len(word))
for i in range(3):
for j in range(3):
if board[i][j]==word[0] and board[i][j+1]==word[1] and board[i][j+2]==word[2]:#horizontal(right)
x=i
z=j
for k in range(len(word)):
#print('valuw of ',k)
if board[x][z]==word[k]:
new_list.append(x)
new_list.append(z)
print(new_list)
z+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list #returns nested list
elif board[i][j]==word[0] and board[i+1][j]==word[1] and board[i+2][j]==word[2]: vertical(downward)
u=i
v=j
for k in range(len(word)):
#print('valuw of ',k)
if board[u][v]==word[k]:
new_list.append(u)
new_list.append(v)
print(new_list)
u+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
elif board[i][j]==word[0] and board[i+1][j+1]==word[1] and board[i+2][j+2]==word[2]: #diagonal
a=i
b=j
for k in range(len(word)):
#print('valuw of ',k)
if board[a][b]==word[k]:
new_list.append(a)
new_list.append(b)
print(new_list)
a+=1
b+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
elif board[i][j]==word[0] and board[i][j-1]==word[1] and board[i][j-2]==word[2]: #horizontal(left)
c=i
d=j
for k in range(len(word)):
#print('valuw of ',k)
if board[c][d]==word[k]:
new_list.append(c)
new_list.append(d)
print(new_list)
d-=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
elif board[i][j]==word[0] and board[i-1][j]==word[1] and board[i-2][j]==word[2]: #verical(upward)
f=i
g=j
for k in range(len(word)):
#print('valuw of ',k)
if board[c][d]==word[k]:
new_list.append(f)
new_list.append(g)
print(new_list)
f-=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
board=[['p','o','t'],['x','y','z'],['a','p','o']]
output=[]
l=['pot','pyo','ozt']
for word in l:
output.append(find(word))
print(output)#print the nested list containing the indices enter code here
解决方法
您需要检查索引对于数组是否实际有效。如果您有一个 3x3 数组并且 i=2,j=2,那么 j+1 将被排除在外,Python 会给您一个 IndexError。您必须更加小心负指数,因为它们不会产生错误,因为 board[-1][-1] 与 board[2][2] 相同。
,这段代码有很多地方可能出错。
- 列表索引超出范围:
您正在对给定板的行和列执行嵌套的for
循环,而从未检查您是否正在访问板中的有效索引。在您的代码中有某些区域,您可以与i+1
类似地执行i+2
和j
。这些当然可以超出您的董事会的范围。
- 函数返回无:
您没有在嵌套的else
循环中处理for
情况。在 python 中,如果你的函数没有到达 return 语句,它会自动返回 None 类型。您的函数在未到达任何return new_list
语句的情况下返回 None 。
查看此代码,我在其中添加了一个新函数,用于检查您是否访问了棋盘中的有效位置。
def is_valid_position(i,j):
return True if i<len(board) and j<len(board[0]) else False
def find(word):
new_list = []
print("length",len(word))
for i in range(3):
for j in range(3):
if is_valid_position(i,j) and is_valid_position(i,j+1) and is_valid_position(i,j+2):
if board[i][j]==word[0] and board[i][j+1]==word[1] and board[i][j+2]==word[2]:
x=i
z=j
for k in range(len(word)):
if board[x][z]==word[k]:
new_list.append(x)
new_list.append(z)
print(new_list)
z+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
if is_valid_position(i,j) and is_valid_position(i+1,j) and is_valid_position(i+2,j):
if board[i][j]==word[0] and board[i+1][j]==word[1] and board[i+2][j]==word[2]:
u=i
v=j
for k in range(len(word)):
if board[u][v]==word[k]:
new_list.append(u)
new_list.append(v)
print(new_list)
u+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
if is_valid_position(i,j+1) and is_valid_position(i+2,j+2):
if board[i][j]==word[0] and board[i+1][j+1]==word[1] and board[i+2][j+2]==word[2]:
a=i
b=j
for k in range(len(word)):
if board[a][b]==word[k]:
new_list.append(a)
new_list.append(b)
print(new_list)
a+=1
b+=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
if is_valid_position(i,j-1) and is_valid_position(i,j-2):
if board[i][j]==word[0] and board[i][j-1]==word[1] and board[i][j-2]==word[2]:
c=i
d=j
for k in range(len(word)):
if board[c][d]==word[k]:
new_list.append(c)
new_list.append(d)
print(new_list)
d-=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
if is_valid_position(i,j) and is_valid_position(i-1,j) and is_valid_position(i-2,j):
if board[i][j]==word[0] and board[i-1][j]==word[1] and board[i-2][j]==word[2]:
f=i
g=j
for k in range(len(word)):
if board[f][g]==word[k]:
new_list.append(f)
new_list.append(g)
print(new_list)
f-=1
if len(new_list) ==len(word)*2:
print(new_list)
return new_list
board=[['p','o','t'],['x','y','z'],['a','p','o']]
output=[]
l=['pot','pyo','ozt']
for word in l:
output.extend(find(word))
print(output)
上面的代码给出如下输出
length 3
[0,0]
[0,1]
[0,1,2]
[0,2]
length 3
[0,2,2]
length 3
[2,2]
[2,2]