使用输入

时间:2018-04-17 11:28:25

标签: python list

我有以下代码:

return [p.to_dict() for p in points]

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

n = 100
count = 0

output = []

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

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

3 个答案:

答案 0 :(得分:5)

使用enumerate并对修改后的列表理解中的索引进行模数来过滤n可分割的那些:

return [p.to_dict() for i,p in enumerate(points) if i % n == 0]

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

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

import itertools
return [p.to_dict() for p in itertools.islice(points,None,None,n)]

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

答案 1 :(得分:5)

列表切片语法采用可选的第三个参数来定义"步骤"。这将在列表中每隔3个进行一次:

 >>> range(10)
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> range(10)[::3]
 [0, 3, 6, 9]

答案 2 :(得分:0)

您可以将enumerate与列表理解结合使用。

[p.to_dict()  for i, p in enumerate(points) if i %100 == 0]