我的GAE應用程序在上傳過程中收到多個文件(可以從0到N)。我有列表files_arguments
列表:如何從列表中創建五個元素的組?
files_arguments = self.request.arguments()
我必須先去5個元素,對它們進行處理。然後採取接下來的5個要素和過程。等等。當然,最後一組可以少於5個元素。
這樣做的代碼應該是什麼? (之後我不會再使用files_arguments
,因此一旦處理就可以從列表中刪除元素)
我的GAE應用程序在上傳過程中收到多個文件(可以從0到N)。我有列表files_arguments
列表:如何從列表中創建五個元素的組?
files_arguments = self.request.arguments()
我必須先去5個元素,對它們進行處理。然後採取接下來的5個要素和過程。等等。當然,最後一組可以少於5個元素。
這樣做的代碼應該是什麼? (之後我不會再使用files_arguments
,因此一旦處理就可以從列表中刪除元素)
這是低科技方法。如果它小於n
,它不會丟棄最後一組。
n = 5
groups = [files_arguments[i:i + n] for i in range(0, len(files_arguments), n)]
def pickN(mylist, N=5):
if (len(mylistl) < N) return mylist
a = mylist[0:N]
for _ in range(N): mylist.pop(0)
return a
正如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
成語的組合是有趣的,所以這裏值得一提。
使用'itertools.izip_longest'將消除部分組被丟棄的問題。 –
如果你想返回全,填充列表的迭代器:
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]]
FMC,能否請你解釋一下它是如何工作的?或者,我該如何使用它 - 首先,我需要獲取前5個元素並處理它們(如何使用代碼執行此操作) –
@LA_'groups'變量包含列表列表。爲了處理每個組,你可以做這樣的事情:'對於組中的g:process_group(g)'。 – FMc