微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的单词搜索:返回字母索引的搜索

如何解决python中的单词搜索:返回字母索引的搜索

#下面的程序检查二维数组中的单词并返回单词索引的嵌套列表。该算法检查水平方向(左和右)、垂直方向(上下)和对角线(左)的单词向右向下) **我面临的问题** #程序为某些词返回正确的索引,但对于某些词它返回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] 相同。

,

这段代码有很多地方可能出错。

  1. 列表索引超出范围:

    您正在对给定板的行和列执行嵌套的 for 循环,而从未检查您是否正在访问板中的有效索引。在您的代码中有某些区域,您可以与 i+1 类似地执行 i+2j。这些当然可以超出您的董事会的范围。


  2. 函数返回无:

    您没有在嵌套的 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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。