我的GAE应用程序在上传中收到几个文件(可以是0到N)。我在files_arguments
列表中有列表:
files_arguments = self.request.arguments()
我需要先拿5个元素来处理它们。然后采取接下来的5个元素和过程。等等。当然,最后一组可以少于5个元素。
这样做的代码应该是什么? (之后我不会使用files_arguments
,因此可以在处理后从列表中删除元素
答案 0 :(得分:6)
这是低技术方法。如果它小于n
,它不会丢弃最后一个组。
n = 5
groups = [files_arguments[i:i + n] for i in range(0, len(files_arguments), n)]
答案 1 :(得分:3)
正如says in the documentation for zip
,
保证了迭代的从左到右的评估顺序。这使得使用
zip(*[iter(s)]*n)
将数据系列聚类成n长度组成为可能。
因此,完整的群组为zip(*[iter(files_arguments)]*5)
,最后的短群组(如果有)为files_arguments[-len(files_arguments)%5:]
。
FMc's answer更简单易懂,但我认为分组的zip
成语很有趣,所以值得一提。
答案 2 :(得分:1)
def pickN( mylist, N=5 ):
if ( len(mylistl) < N) return mylist
a = mylist[0:N]
for _ in range(N): mylist.pop(0)
return a
答案 3 :(得分:1)
如果你想要一个返回完整填充列表的迭代器:
def group(a, n=5, default=None):
a = iter(a)
while True:
yield [next(a)] + [next(a, default) for i in range(n-1)]
>>> list(group(range(8))
[[0, 1, 2, 3, 4], [5, 6, 7, None, None]]