2017-02-17 2 views
0

Я хочу использовать цикл 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

Избавьтесь от внешнего контура. Сделайте 'для буквы в доске [row_index]:' для вашего внутреннего цикла. Или избавиться от всех циклов и просто «вернуть» .join (board [row_index]) '. –

+0

Спасибо @StevenRumbalski Очень четкое, краткое объяснение! – sim

ответ

1

row_index не так, как вы думаете. В Python синтаксис for loop, который вы используете, заставляет контрольную переменную хранить элемент в коллекции (в этом контексте). Другими словами, вы выполняете итерацию через каждый под-список в 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])

... конкатенировать тя racters в строке на 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])