2017-02-17 78 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])