2016-03-01 56 views
-2

使用多维列表帮助下面的代码我需要搜索数组中的每一行字符并找到一个单词并返回第一个字母的位置。这适用于一个字母,但是当我尝试以字母开头的单词而不是整个单词时,它不起作用。有人可以帮助我吗?我可以看到,我从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) 
+2

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在发布代码*和*准确描述问题之前,我们无法有效帮助您。 “它不工作”和“我一直搞乱”不是问题描述。单字母变量名称和没有描述性注释将您的代码作为猜谜游戏留给其他人。 – Prune

+0

另外,为什么当单词从[2,0]开始时期望[2,1]?位置[2,1]是'c'。你的代码已经为任何以'a'开头的东西产生了[2,0] - 这是一个开始。 – Prune

+1

您可能还会从[如何调试](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)中获取一些提示。 – Prune

回答

1

我扫描你的计划,我想已经找到概念性问题。

看来,你错处理找到:你把它设置(以),只要你找到一个匹配单个字符。如果后面的字母不匹配,您无法清除找到(至)。

首先,我建议你对问题有更高的认识:一次查找整个单词。加入该行的字母转换成字符串,然后使用找到方法:

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

这可以取代你的多中心的逻辑。如果你想要Pythonic快捷方式,你可以将上面的两行或者一行结合起来,如果你想通过优化或复制一个电话来获得一个技巧。我不推荐它。


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

你搞砸循环索引值:当仍处于在第11行循环有效,那么你在19行重新使用它作为一个循环索引这会破坏其原有的使用。

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

为什么你将r设置为行号......多次?如果您需要的行号,然后只需运行正是如此你的外循环:

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

...这是最后你必须操纵任一。您似乎在最内层循环中执行了与ct类似的操作。

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

+0

感谢队友的帮助,我肯定会尝试使用上面提到的点来重做,非常感谢。 – kbbkirl

+0

当你解决这个问题的时候,记得要“接受”一个答案:因为这样可以很好地解决问题;你会得到回报,就像写出答案的人一样。请记住,撰写综合答案以结合所有帮助也是可以的,并接受您自己的提交。对那些帮助过的人进行投票也是好的做法。 – Prune