让我们有一个值列表和一个任意整数。
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])
但是有人怀疑这里可以用list comprehension。 你能帮我理解如何做到这一点吗?
最佳答案
只需移动 list.append()
中的表达式即可调用前面,并添加 for
循环:
grouped_values = [values[i:i + 9] for i in range(rows_number)]
请注意,这不会将您的输入列表分割成连续 元素 block 。它产生一个滑动窗口;你切片values[0:9]
然后values[1:10]
等。它在输入数据上生成窗口,每个窗口的长度为 9,其中 8 个元素与前一个窗口重叠。要生成长度为 9 的连续 block ,请使用 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>]
这里唯一的区别是 list_name
直到在 整个列表推导被执行后才被设置。您不能引用从列表理解内部构建的列表。
有时您需要在产生最终 <expression>
的循环体中移动额外的代码在达到上述模式之前将值转换为单个表达式。
请注意,<expression>
在这里并不重要本身产生列表对象;它们可以是全新的列表理解或任何其他有效的 Python 表达式。
当有更多的时候for
循环或 if
添加嵌套级别的语句,然后列出添加的 for
循环和 if
在生成的列表理解中从左到右的语句;例如,模式
<list_name> = []
for <targets1> in <iterable1>:
if <test_expression>:
for <targets2> in <iterable2>:
<list_name>.append(<expression>)
成为
<list_name> = [
<expression>
for <targets> in <iterable>
if <test_expression>
for <targets2> in <iterable2>
]
关于python - 我有一个 for 循环来创建一个列表,我可以改用列表理解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48487468/