从二维填字游戏或二维列表中垂直查找单词

Find word vertically from 2D crosswords or 2D lists

我写了一些 python 代码来从 2D 填字游戏中查找行和列索引,垂直搜索。我的代码是:

def find_word_vertical(crosswords,word):
    l=[]
    for i in range(len(crosswords[0])):
            l.append(''.join([row[i] for row in crosswords]))
            print(l)            
            if word in l:   #finding index
                row_index=crosswords.index(i)
                column_index=i.index(word[0])
                print(row_index,column_index)
                return [row_index,column_index ]
    return None
crosswords=[['s','d','o','g'],['c','u','c','m'],['a','c','a','t'],['t','e','t','k']]
word='cat'
print(find_word_vertical(crosswords,word))

我的代码当前正在返回 None,但它应该返回索引值 [1,0]

如何从所选单词 (cat) 的填字游戏中正确获取列索引和行索引?

您的代码返回 None 因为在第 11 行您 字面意思 return None.

我怀疑你是想 returnl?

crux of the issue with your code is some misuse of the Python list index method。具体来说,在代码的第 7 行(已发布)。 您似乎正在使用 index 执行列表查找(通常使用方括号 [] 完成)。

另外,您似乎也有一些 type confusion (which is easy when starting in a loosely typed language such as Python) 发生。发生这种情况是因为 l 变量(我 假设 是行的 shorthand?)是 list,而不是字符串。因此,条件 word in l 永远不会 为真 - 因此使您的程序始终 return None 就好像不存在匹配项一样。


代码:

以下代码有效:

def find_word_vertical(crosswords,word):
    l=[]
    for i in range(len(crosswords[0])):
            l.append(''.join([row[i] for row in crosswords]))
            for line in l:
                if word in line:   #finding index
                    row_index=i
                    column_index=line.index(word[0])
                    return (row_index,column_index)
    raise Exception("Unable to find word vertically!")

crosswords=[['s','d','o','g'],['c','u','c','m'],['a','c','a','t'],['t','e','t','k']]
word='cat'

print(find_word_vertical(crosswords,word))

变化:

  1. 添加了 for line in l: 循环(第 5 行),这解决了您遇到的类型混淆问题。 注意:可能有其他(可能更好)解决这个问题的方法。

  2. row_index 更改为仅设置为 i - 因为我们 已经 使用该变量在该维度中进行迭代。

  3. 更改 column_index 以使用 line,而不是 i(这只是一个计数器)。

  4. 这在技术上 不是必需的,您可能不希望使用它..但我删除了 return None 并替换了它出现异常(针对意外算法结果的更好做法)。


其他推荐:

  • 你的"main"样式代码(crosswordsword的定义和调用的打印行你的函数)将 best 放入 if __name__=="__main__": 块中。

  • 对于重要的东西(比如你在这里使用的l,避免使用单字母变量名(比如l) ).我会将其更改为 vertical_line 或类似的。

  • 您在第一个 for 循环中提供给 range 的参数使 假设 所有填字游戏线的长度相同 你在任何地方都没有逻辑来强制执行此操作。


完成程序后,请考虑 posting it on the Code Review 站点以供审核。

def find_word_vertical(crosswords,word):
    z=[list(i) for i in zip(*crosswords)]   
    for rows in z:          
        row_index = z.index(rows)
        single_row = ''.join(rows)      
        column_index = single_row.find(word)        
        if column_index >= 0:
            return([column_index, row_index])

我修改了代码,这段代码给了我正确的索引 [1,0]