从二维填字游戏或二维列表中垂直查找单词
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
.
我怀疑你是想 return
l
?
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))
变化:
添加了 for line in l:
循环(第 5 行),这解决了您遇到的类型混淆问题。 注意:可能有其他(可能更好)解决这个问题的方法。
将 row_index
更改为仅设置为 i
- 因为我们 已经 使用该变量在该维度中进行迭代。
更改 column_index
以使用 line
,而不是 i
(这只是一个计数器)。
这在技术上 不是必需的,您可能不希望使用它..但我删除了 return None
并替换了它出现异常(针对意外算法结果的更好做法)。
其他推荐:
你的"main"样式代码(即crosswords
、word
的定义和调用的打印行你的函数)将 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]
我写了一些 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
.
我怀疑你是想 return
l
?
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))
变化:
添加了
for line in l:
循环(第 5 行),这解决了您遇到的类型混淆问题。 注意:可能有其他(可能更好)解决这个问题的方法。将
row_index
更改为仅设置为i
- 因为我们 已经 使用该变量在该维度中进行迭代。更改
column_index
以使用line
,而不是i
(这只是一个计数器)。这在技术上 不是必需的,您可能不希望使用它..但我删除了
return None
并替换了它出现异常(针对意外算法结果的更好做法)。
其他推荐:
你的"main"样式代码(即
crosswords
、word
的定义和调用的打印行你的函数)将 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]