python - 我有一个 for 循环来创建一个列表,我可以改用列表理解吗?

标签 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])

但是有人怀疑这里可以用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/

相关文章:

python - 使用新行读取 csv 文件

python - 无法从Python函数内部访问全局变量

python - 列表理解 Append Odds Twice Evens Once

python - 在一行中构建 for 循环并收到错误的输出,这是一个 Nonetype

python - 在python中比较两个窗口路径,一个包含波浪号

python - 是否可以使用 numpy 乘法将字符串乘以整数?

python - Ubuntu、 python : Cannot import python shapely package

python - 如何在列表理解中做作业?

python - 如何使用列表推导删除列表中相邻的重复元素?

python - 是否有 "Pythonic"方法来创建包含条件项的列表?