我有以下代码:
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方式来写这个,以获得相同的结果?
答案 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]