2016-03-06 55 views
2

該單詞的行索引和列索引的交叉寫功能命名find_word_horizo​​ntal接受字符的 2維列表(如填字遊戲)和一個 字符串(單詞)作爲輸入參數。該函數搜索 第2d列表的行以找到匹配的單詞。如果找到匹配項,則此函數將返回一個包含匹配起始點的行索引和列索引的列表,否則返回值None(無 報價單)。的Python:查找在2D列表中的單詞並返回是在列表

注意:我很抱歉發佈一個很長的帖子在這裏。我很抱歉,但沒有發佈適當的問題,我不可能尋求幫助。

For example if the function is called as shown below: 
> 
> crosswords=[['s','d','o','g'],['c','u','c','m'],['a','c','a','t'],['t','e','t','k']] 
> word='cat' 
> 
> find_word_horizontal(crosswords,word) 
> 
> then your function should return [2,1] 
> 
> Notice that the 2d input list represents a 2d crossword and the 
> starting index of the horizontal word 'cat' is [2,1] 
Note: In case of multiple matches only return the match with lower row index. If you find two matches in the same row 
then return the match with lower column index 

我寫了這段代碼。也許這可能不是最好的代碼,但是:

def find_word_horizontal (crosswords, word): 
    list = [] 
    output_list = [] 
    row_index = -1 
    column_index = 0 
    list = word.split() 
    for sublist in crosswords: 
     if (sublist[1:] == list[:] or sublist[0:-1] == list[:]): 
      column_index += 1 
     row_index += 1 
    output_list.append(row_index) 
    output_list.append(column_index) 
    return (output_list) 

#Main Program 
crosswords = [['s','d','o','g'],['c','u','c','m'],['a','c','a','t'],['t','e','t','k']] 
word = 'cat' 
result = find_word_horizontal(crosswords,word) 
print (result) 

什麼我在這裏做的是首先把這個詞(即「貓」)到一個列表。第二,我已將sublist(即2d列表中的列表)切片以檢查三個字母的單詞「cat」。我知道我有這種硬編碼,但我找不到任何其他方式。上面,這個問題要求以這種方式。

這是我得到的輸出:

[3, 0] 

爲什麼不是if語句更新Column_Index中的價值?切片順序或什麼有問題?任何幫助,將不勝感激。

+0

一個單詞可以跨越多行,所以前三個字母在一個列表中,最後兩個在下一個?如果不是的話,一個簡單的方法可能是將每一行連接在一起並搜索整個字符串,而不是逐字比較字符。如果你認爲這會起作用,我可以在以後寫一個答案。 –

+0

當然>感謝您的幫助。 –

+0

試試吧,讓我知道如果作品如何! –

回答

1

希望這有助於我留下了一些版畫所以你可以看到發生了什麼事情:

def find_word_horizontal (crosswords, word): 
    for row_index, row in enumerate(crosswords): 
     print('input: ', row_index, row) 
     row_string = ''.join(row) 
     print('joined row: ', row_string) 
     column_index = row_string.find(word) 
     if(column_index > -1): 
      return [row_index, column_index] 

find_word_horizontal(crosswords, word) 

輸出:

input: 0 ['s', 'd', 'o', 'g'] 
joined row: sdog 
input: 1 ['c', 'u', 'c', 'm'] 
joined row: cucm 
input: 2 ['a', 'c', 'a', 't'] 
joined row: acat 
Out[5]: [2, 1] 

讓我知道如果您有任何問題!

1

word.split()不會將單詞分成字符列表,但list(word)會。然後,在獲取索引時存在輕微的邏輯缺陷,但在循環中使用enumerate在此處非常有用。

def find_word_horizontal (crosswords, word): 
    input_list = list(word) 
    output_list = [] 
    row_index = -1 
    column_index = 0 
    for outer_index, sublist in enumerate(crosswords): 
     for inner_index in xrange(0,(len(sublist)-len(input_list)+1)): 
      if sublist[inner_index:inner_index+len(input_list)]==input_list: 
       return [outer_index,inner_index] 

它也可能不是一個好主意名稱變量「列表」。

+0

上面的代碼只適用於三個字母的單詞。這是我運行時得到的錯誤。 #您的功能返回不正確,但您的打印輸出正確。 #例如,如下所示調用函數時: #find_word_horizo​​ntal([['a','b'],['c','d']],'cd') #您的函數返回: #None #從函數返回的變量類型爲:無類型 #教師函數返回: [1,0] #教師函數返回的變量類型爲:列表 –

+0

另外,如何遍歷列元素以查找匹配? –

相關問題