我有一个for循环来创建一个列表,我可以使用列表推导吗?

时间:2018-01-28 14:35:55

标签: python list-comprehension

让我们有一个值列表和一个任意整数。

values = ['5', '3', '.', '.', '7', '.', '.', '.', '.', '6', '.', '.', '1', '9', '5', '.', '.', '.', '.', '9', '8', '.', '.', '.', '.', '6', '.', '8', '.', '.', '.', '6', '.', '.', '.', '3', '4', '.', '.', '8', '.', '3', '.', '.', '1', '7', '.', '.', '.', '2', '.', '.', '.', '6', '.', '6', '.', '.', '.', '.', '2', '8', '.', '.', '.', '.', '4', '1', '9', '.', '.', '5', '.', '.', '.', '.', '8', '.', '.', '7', '9']

n = 9

我想将这些值分组为n个数字。

我们假设n=9,即9个数字将连续存在。

结果应该是这样的:

grouped_values = [
     ['5', '3', '.', '.', '7', '.', '.', '.', '.'],
     ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
     ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
     ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
     ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
     ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
     ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
     ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
     ['.', '.', '.', '.', '8', '.', '.', '7', '9']]

我可以这样做:

def group(values, n):
   rows_number = int(len(values)/n) # Simplified. Exceptions will be caught.
   grouped_values = []

   for i in range(0, rows_number):
      grouped_values.append(values[i:i+9])

但有人怀疑列表理解可以在这里使用。 你能帮我理解怎么做?

1 个答案:

答案 0 :(得分:11)

只需将list.append()调用中的表达式移到前面,然后添加for循环:

grouped_values = [values[i:i + 9] for i in range(rows_number)]

请注意,将输入列表切割为连续元素的块。它产生一个滑动窗口;你切片values[0:9]然后values[1:10]等。它在输入数据上产生窗口,每个长度为9,其中8个元素与前一个窗口重叠。要生成长度为9 的连续块,请使用range(0, len(values), n)作为范围,无需计算rows_number

grouped_values = [values[i:i + n] for i in range(0, len(values), n)]

每当你看到这样的模式时:

<list_name> = []

for <targets> in <iterable>:
    <list_name>.append(<expression>)

其中<expression>未引用<list_name>,您可以将其简单地转换为

<list_name> = [<expression> for <targets> in <iterable>]

这里唯一的区别是{<1}}在之后完成列表理解后才设置。您无法在列表推导中引用正在构建的列表。

有时您需要在产生最终list_name值的循环体中将其他代码移动到单个表达式中,然后才能达到上述模式。

请注意,<expression>本身生成列表对象并不重要;它们可以是全新的列表推导或任何其他有效的Python表达式。

当有更多<expression>循环或for语句添加了嵌套级别时,请在列表中从左到右列出添加的if循环和for语句结果列表理解;例如,模式

if

变为

<list_name> = []

for <targets1> in <iterable1>:
    if <test_expression>:
        for <targets2> in <iterable2>:        
            <list_name>.append(<expression>)