【问题标题】:How to make a proper word searcher with Python?如何用 Python 做一个合适的词搜索器?
【发布时间】:2018-11-11 12:42:54
【问题描述】:

我有一个任务,我们必须在单词搜索中找到单词(减去对角线)。

M L G Y J U G D T W W I S F P
G Y O H I K O P V F J B J J H
N B I M T M Y W R D J E C A I
I Y M X C U E U Z G U I J Y C
K D P S L R W J I N C N S W T
O P S D I D A B Z I D G D A B
M X D H K E B H U G T S I L G
S G D U Y R V D G N D M L K M
S P X K T W E F P I G E J I T
B U L B C M K I F S I L F N W
Z Q L X H G C J N D I L B G C
M T B W Z L A D A A X Y O K X
A E C Z K F Y V F B U V G A W
Y G O Z E A W J R N S Q J E A
L O I T E R I N G H F I P G R

这是我们以文本文件形式提供的15x15 单词搜索。我们必须从列表中识别出搜索中的犯罪词:

["JAYWALKING", "BURGLARY", "LAUNDERING", "BADSINGING", "REDRUM", "SMOKING", "BEINGSMELLY","CONNING", "SCAMS", "LOITERING"]

我已经通过单词搜索并确定需要找到的单词是:redrum、badsinging、beingsmelly、jaywalking 和 loiting。

但是,在我的代码中,我只能从每个方向得到一个结果:闲逛和乱穿马路。我希望有人能给我一些建议,告诉我如何让它完全发挥作用。

def crossword():
empty_list = []
crimes = ["JAYWALKING", "BURGLARY", "LAUNDERING", "BADSINGING", "REDRUM", "SMOKING", "BEINGSMELLY",
          "CONNING", "SCAMS", "LOITERING"]
confession = open("confession.txt", "r")
for line in confession:
    line = line.strip("\n")
    new_list = line.split(' ')
    empty_list.append(new_list)

#horizontal
words = []

for i in range(len(empty_list)):
    string_1 = ""
    string_2 = ""
    m = len(empty_list[i])
    for j in range(len(empty_list[i])):
        string_1 = string_1 + empty_list[i][j]
        string_2 = string_2 + empty_list[i][m-1-j]
    for k in range(len(crimes)):
        if crimes[k] in string_1 or crimes[k] in string_2:
            words.append(crimes[k])


#vertical
for i in range(len(empty_list)):
    string_1 = ""
    string_2 = ""
    m = len(empty_list[i])
    for j in range(len(empty_list[i])):
        string_1 = string_1 + empty_list[j][i]
        string_2 = string_2 + empty_list[j][m-1-i]
    for k in range(len(crimes)):
        if crimes[k] in string_1 or crimes[k] in string_2:
            words.append(crimes[k])
            return words

print("Gentleman GoGo is guilty of:")
print(crossword())

【问题讨论】:

  • 首先你在循环内部返回,就在倒数第二个打印之前。这意味着它将进入循环,追加并返回单词列表。哪个有单项是:/
  • 也停止使用“open”——改为使用“with open”结构来避免像当前代码中出现的错误——你永远不会关闭那个文件

标签: python python-3.x list file loops


【解决方案1】:

这段代码没有经过优化(当然可以以更高性能、更高阶的方式完成),但是看看https://repl.it/repls/DependentBubblyAssignment

我认为一种非常清晰且对初学者友好的方法是创建第二个列表,将列重新排序为行 - 然后以与行中相同的方式搜索列以查找匹配项。

repl.it 代码的详细信息:

crime in row or crime in row[::-1] - 检查 crime 是否存在于 ltr 或 rtl row

verticals = ['' for char in slist[0]] - 创建一个列表,其中填充对应于第一行长度的空字符串(不包括空格,感谢之前的line.split(' ')

verticals[col] += slist[row][col] - 从row 处的col 的原始字符串中获取字符并将其附加到当前垂直的col 索引

对于您的示例数据,它会找到 ['LOITERING', 'SMOKING', 'REDRUM', 'BADSINGING', 'BEINGSMELLY', 'JAYWALKING']

【讨论】:

  • 非常感谢。我注意到一个错误,其中一个水平词(闲逛)被遗漏了,以换取代码运行时不存在的东西(吸烟)。我会尝试解决这个问题。这段代码比我试图做的更容易理解。
  • YW - 但是您是指输入数据中的错误还是我的代码中的错误(我不明白那部分)?
  • 我在repl.it/repls/DependentBubblyAssignment 中添加了一些调试代码 - 我不确定你在哪里看到错误发生,你能解释一下吗?
  • 如果你看一下搜索词本身,在底部的水平线上,你可以看到“闲逛”这个词。但是,您生成的代码返回“吸烟”,这在拼图中完全不存在。垂直部分会产生预期的结果,但水平部分不会。
  • 我很抱歉。它现在正在输出游荡。我不知道发生了什么事,我在之前通过它时完全错过了在垂直部分吸烟。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多