多维列表搜索

时间:2016-03-01 17:22:41

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

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

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)

1 个答案:

答案 0 :(得分:1)

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

您似乎错误地处理了发现:一旦找到匹配的单个字符,就将其设置为( True )。如果以后的字母不匹配,则无法清除找到 False )。

首先,我建议您更深入地了解问题:一次查找整个单词。将行的字母加入字符串,然后使用查找方法:

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]

......这是你必须操纵其中任何一个的最后一个。你似乎在最里面的循环中用 c t 做了类似的事情。

我希望这足以让你前进,并帮助你在某种程度上收紧你的节目。