使用输入中的每个第n个值生成列表

v25*_*v25 1 python list

我有以下代码:

return [p.to_dict() for p in points]
Run Code Online (Sandbox Code Playgroud)

我将其更改为仅打印每第n行:

n = 100
count = 0

output = []

for p in points:
    if (count % n == 0):
        output.append(p.to_dict())
    count += 1
return output
Run Code Online (Sandbox Code Playgroud)

是否有更多的pythonic方式来写这个,以获得相同的结果?

Jea*_*bre 5

enumerate在修改后的列表理解中对索引使用和模数来过滤可分割的n:

return [p.to_dict() for i,p in enumerate(points) if i % n == 0]
Run Code Online (Sandbox Code Playgroud)

列表理解过滤是好的,但在这种情况下,由于直接计算索引,因此建议使用步骤切片的eduffy答案更好.仅在无法预测索引时才使用过滤器部件.

更进一步改进这个答案:使用它更好,itertools.islice所以不生成临时列表:

import itertools
return [p.to_dict() for p in itertools.islice(points,None,None,n)]
Run Code Online (Sandbox Code Playgroud)

itertools.islice(points,None,None,n)相当于points[::n]但执行惰性评估.


edu*_*ffy 5

列表切片语法采用可选的第三个参数来定义"步骤".这需要列表中的每3个:

 >>> range(10)
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> range(10)[::3]
 [0, 3, 6, 9]
Run Code Online (Sandbox Code Playgroud)