让我们有一个值列表和一个任意整数。
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])
但有人怀疑列表理解可以在这里使用。 你能帮我理解怎么做?
答案 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>)