2017-02-17 76 views
0

我想使用for循環在列表列表中查找列表。從列表中返回特定列表,使用for循環

爲什麼它返回列表0而不是列表2?

def make_str_from_row(board, row_index): 
    """ (list of list of str, int) -> str 

    Return the characters from the row of the board with index row_index 
    as a single string. 

    >>> make_str_from_row([['H', 'O', 'U', 'S', 'E'], ['B', 'E', 'D'], ['C', 'H', 'E', 'E', 'S', 'E']], 2) 
    'CHEESE' 
    """ 

    letter = '' 
    line = '' 

    for row_index in board: 
     for letter in row_index: 
      line = line + letter 
     return line 

make_str_from_row([['H', 'O', 'U', 'S', 'E'], ['B', 'E', 'D'], ['C', 'H', 'E', 'E', 'S', 'E']], 2) 
+1

擺脫你的外層循環。對於你的內部循環,請在board [row_index]:中輸入':'。或者擺脫所有循環,只是'return''.join(board [row_index])'。 –

+0

謝謝@StevenRumbalski非常清晰,簡潔的說明! – sim

回答

1

row_index是不是你認爲它是。在Python中,您使用的for循環語法會使控件變量將元素存儲在集合中(在此上下文中)。換句話說,您正在遍歷board中的每個子列表,其中對於每次迭代,row_index被更新爲指向下一個子列表。 你需要的是一個單一的訪問,然後你內心的循環:

sub_list = board[row_index] 
    for letter in sub_list: 
     line = line + letter 
    return line 

以下是等價的:

for letter in board[row_index]: 
     line = line + letter 
    return line 

在另一方面,因爲你的函數是指返回一個連接字符串版本給定SUB_LIST,你可以考慮在一個在線解決方案...

return ''.join(board[row_index])

...來串聯茶在board[row_index]的字符串中。 join被認爲比+=更有效,因爲它避免了子字符串的浪費構造和丟棄。 (您爲每個+=創建一個完全不同的字符串。)尤其對於長字符串,join是一個很好的解決方案。

+0

謝謝@synchronizer!我對一件事有點困惑。爲什麼函數返回子列表[0]。如果函數遍歷每個子列表,爲什麼它不返回所有的子列表?謝謝! – sim

+0

@sim不客氣。爲了回答你的問題,該函數僅將子列表0作爲字符串返回,因爲你在循環中預先返回。也就是說,在循環有機會追加其他'sub_lists'中的字符之前,您將在第一次迭代結束時返回。 (雖然這是不受歡迎的行爲)。這有幫助嗎? – synchronizer

+0

太棒了!頭痛被刪除! :d – sim

0

問題是你總是返回列表的第一個元素。請記住,return使功能立即完成。另外,您的變量letter可能會被刪除。你不需要初始化它,因爲它是for循環的一部分。最後,你的代碼可能很簡單:

def make_str_from_row(board, row_index): 
    """ (list of list of str, int) -> str 

    Return the characters from the row of the board with index row_index 
    as a single string. 

    >>> make_str_from_row([['H', 'O', 'U', 'S', 'E'], ['B', 'E', 'D'], ['C', 'H', 'E', 'E', 'S', 'E']], 2) 
    'CHEESE' 
    """ 

    return ''.join(board[row_index])