【问题标题】:multidimensional list search多维列表搜索
【发布时间】:2016-06-14 05:58:24
【问题描述】:

使用多维列表帮助下面的代码我需要在每一行中搜索数组中的字符并找到一个单词并返回第一个字母的位置。这对一个字母非常有效,但是当我尝试一个以数组中的字母开头但不是整个单词的单词时,它不起作用。有人可以在这里帮助我。我可以看到我从 x=word[0] 开始,但是每当我尝试增加 x 的值以包括在内时,我都会搞砸。基本上我需要 'aca' 来返回 [2, 1] 因为这是单词中第一个字符的开始,但输入了我 ara NONE 应该是返回值。

def find_word_horizontal(crosswords,word):

    word=str(word)
    x=word[0]
    char=0
    crosslen=len(crosswords)
    found=False

    for row in crosswords:
        r=crosswords.index(row)
        wordcount=len(word)
        for i in range(0, len(row)):
            if wordcount<2:
                if row[i]==x:
                    r=crosswords.index(row)
                    found=True
                    print([r, i])
                    return([r, i])
            else:
                for i in range(0, len(row)):
                    for let in word:
                        if row[i]==let and char<=wordcount:
                            char+=1
                        if char==wordcount:
                            t=0
                            for c in row:
                                if c==x:
                                    found=True
                                    r=crosswords.index(row)
                                    print([r, t])
                                    return([r, t])
                                t+=1
                            char=0
                        else:
                            continue
    if found==False:
        print(None)
        return None

crosswords=[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']]
word='aca'
find_word_horizontal(crosswords,word)

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码准确描述问题之前,我们无法有效地帮助您。 “它不起作用”和“我一直在搞砸”不是问题描述。单字母变量名和没有描述性的 cmets 让您的代码成为别人的猜谜游戏。
  • 另外,当单词从 [2,0] 开始时,您为什么期望 [2,1]?位置 [2,1] 是“c”。您的代码已经为以“a”开头的任何内容生成 [2,0] - 这是一个开始。
  • 您还可以从How to Debug 那里获得一些提示。

标签: python list python-3.x multidimensional-array


【解决方案1】:

我扫描了你的程序,我认为我发现了概念问题。

您似乎错误地处理了 found:您在找到匹配的单个字符后立即将其设置为(True)。如果后面的字母不匹配,您将无法清除 found(为 False)。

首先,我建议您从更高的角度看待问题:一次查找整个单词。将该行的字母连接成一个字符串,然后使用find方法:

whole_row = ''.join(row)
found_at = whole_row.find(word)
if found_at >= 0:
    return([r, found_at])

这可以取代您的大部分中心逻辑。如果你想要 Pythonic 的捷径,你可以结合上面的前两行——或者如果你想通过优化来拉一个技巧或复制一个调用。我还不推荐它。


请使用描述性变量名称。带有单个字母的东西应该没有个性,只能用于紧密的循环。不要错误命名:char 应该是单个字符,但您已将其设为整数。

您弄乱了循环索引的值:虽然 i 在第 11 行的 for 循环中仍然处于活动状态,但您随后将其重用为循环索引在第 19 行。这破坏了它的原始用途。

为什么你们都打印和返回结果?

为什么要将 r 设置为行号...多次?如果你需要行号,那么只需运行你的外部循环:

for row_num in range(len(crosswords)):
    row = crosswords[row_num]

...这是您最后必须操纵其中任何一个。您似乎在最内层循环中使用 ct 做了类似的事情。

我希望这足以让您继续前进,并帮助您稍微收紧编程。

【讨论】:

  • 感谢伙伴的帮助,我肯定会尝试使用上述要点进行返工,非常感谢您的帮助。
  • 当你解决这个问题时,记得“接受”一个答案:所以很好地引退这个问题;你会得到分数,写答案的人也会得到分数。请记住,也可以编写一个摘要答案以结合所有帮助,并接受您自己的提交。对提供帮助的人进行投票也是一种很好的做法。
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 2016-05-03
  • 2011-07-05
  • 2021-08-23
相关资源
最近更新 更多