2011-07-31 42 views
1

我的GAE應用程序在上傳過程中收到多個文件(可以從0到N)。我有列表files_arguments列表:如何從列表中創建五個元素的組?

files_arguments = self.request.arguments() 

我必須先去5個元素,對它們進行處理。然後採取接下來的5個要素和過程。等等。當然,最後一組可以少於5個元素。

這樣做的代碼應該是什麼? (之後我不會再使用files_arguments,因此一旦處理就可以從列表中刪除元素)

回答

5

這是低科技方法。如果它小於n,它不會丟棄最後一組。

n = 5 
groups = [files_arguments[i:i + n] for i in range(0, len(files_arguments), n)] 
+0

FMC,能否請你解釋一下它是如何工作的?或者,我該如何使用它 - 首先,我需要獲取前5個元素並處理它們(如何使用代碼執行此操作) –

+0

@LA_'groups'變量包含列表列表。爲了處理每個組,你可以做這樣的事情:'對於組中的g:process_group(g)'。 – FMc

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

正如says in the documentation for zip

的iterables的左到右的評價順序有保證。這使得使用zip(*[iter(s)]*n)將數據序列聚類爲n長度組成爲可能。

所以整個組是zip(*[iter(files_arguments)]*5)和最後的短組(如果有的話)是files_arguments[-len(files_arguments)%5:]

FMc's answer在這種情況下更簡單,更容易理解,但我認爲zip成語的組合是有趣的,所以這裏值得一提。

+0

使用'itertools.izip_longest'將消除部分組被丟棄的問題。 –

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]] 
相關問題