如何从列表中创建五个元素组?

时间:2011-07-31 14:38:42

标签: python google-app-engine list

我的GAE应用程序在上传中收到几个文件(可以是0到N)。我在files_arguments列表中有列表:

files_arguments = self.request.arguments()

我需要先拿5个元素来处理它们。然后采取接下来的5个元素和过程。等等。当然,最后一组可以少于5个元素。

这样做的代码应该是什么? (之后我不会使用files_arguments,因此可以在处理后从列表中删除元素

4 个答案:

答案 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]]