2016-10-04 44 views
0

如何使用嵌套for循環而不是列表理解來重寫?如何將這個列表理解改寫爲for循環?

final= [[]] 
    for i in array_list: 
     final.extend([sublist + [i] for sublist in final]) 


    return final 
+0

你是什麼意思「典型的循環」? –

+0

您想要將for循環重寫爲for循環嗎? – Carcigenicate

+0

第二個循環是使用「單行」for循環完成的。我想實現它像循環的第一個。我試過了,但我得到了內存錯誤 – mike991

回答

2

如果您嘗試遍歷最終你擴展它,它創建了一個無限循環。因爲每次你到下一個元素,你都會添加另一個元素,所以你永遠不會到達列表的末尾。

如果要將內循環作爲for循環而不是列表理解,則需要遍歷最終的副本。

final = [[]] 
for i in [1, 2, 3]: 
    for sublist in final[:]: 
     final.extend([sublist + [i]]) 
+0

他的代碼停止。 –

+0

@patrickhaugh是的,目前它確實,但是op想要使用嵌套for循環。 –

+0

謝謝你的作品! – mike991

0

您的解決方案似乎是一個很好的for循環之一。使用itertools一行代碼是可能的,但很醜

list(itertools.chain(list(itertools.combinations(arr, i)) for i in range(len(arr) + 1))) 

編輯:

更漂亮:

list(itertools.chain(*[itertools.combinations(arr, i) for i in range(len(arr)+1)])) 
0

此代碼也似乎給出與您的代碼相同的結果。

final = [[]] 
for i in array_list: 
    for sublist in list(final): 
     final.extend([sublist + [i]]) 
return final 

好像你的代碼取最後一次迭代的元素,並與當前迭代的元素將它們組合(參見「樣本」下面)。爲了使用傳統的for循環執行此操作,您需要防止正在循環的列表在循環時更新。我通過打破「最終」列表變量的鏈接來做到這一點。這可以通過list()函數或通過切片來完成(然後您需要按照Morgan的建議進行替換)。

對於[1,2,3]的array_list將得到以下。每行(除了行)都是「最終」列表變量的新元素。

[] 
-------------------------------- 
1   > array_list[0] 
-------------------------------- 
2   > array_list[1] 
1, 2  > array_list[0] + array_list[1] 
-------------------------------- 
3   > array_list[2] 
1, 3  > array_list[0] + array_list[2] 
2, 3  > array_list[1] + array_list[2] 
1, 2, 3  > array_list[0] + array_list[1] + array_list[2]