从2D填字游戏或2D列表中垂直查找单词

时间:2016-03-06 05:57:10

标签: python list puzzle

我编写了一些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)的填字游戏中正确获取列索引和行索引?

3 个答案:

答案 0 :(得分:0)

您的代码问题的crux是对Python list index method的误用。具体来说,在代码的第7行(如已发布)。 您似乎正在使用index执行列表查找(通常使用方括号[]完成)。

另外,您似乎也发生了一些type confusion (which is easy when starting in a loosely typed language such as Python)。这是因为l变量(我假设是行的简写?)是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))

的变化:

  1. 添加了for line in l:循环(第5行),这解决了您遇到的类型混淆问题。 注意:可能有其他(可能更好)方式。

  2. row_index更改为i - 因为我们已经在该维度中使用该变量进行迭代。

  3. 更改了column_index以使用line,而不是i(这只是一个反击)。

  4. 这个在技术上是不必要的,你可能希望不使用它..但是我删除了return None并将其替换为异常(更好的练习一个意想不到的算法结果)。

  5. 其他建议:

    • 您的“主要”样式代码( crosswordsword的定义以及调用您的函数的打印行)将 best < / strong>被放入if __name__=="__main__":区块。

    • 避免使用重要事项的单字母变量名称(如l)(例如您在此处使用的l)。我会将其更改为vertical_line或类似。

    • 您在第一个range循环中提供给for的参数,使假设 所有填字游戏行的长度相同在我能看到的任何地方都没有任何逻辑可以强制执行。

    完成您的计划后,请考虑posting it on the Code Review网站进行审核。

答案 1 :(得分:0)

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]

答案 2 :(得分:-1)

您的代码正在返回None,因为在第11行您字面上 return None

我怀疑你的意思是return l