我有以下代码:
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方式来写这个,以获得相同的结果?
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]但执行惰性评估.
列表切片语法采用可选的第三个参数来定义"步骤".这需要列表中的每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)