如何使用嵌套for循環而不是列表理解來重寫?如何將這個列表理解改寫爲for循環?
final= [[]]
for i in array_list:
final.extend([sublist + [i] for sublist in final])
return final
如何使用嵌套for循環而不是列表理解來重寫?如何將這個列表理解改寫爲for循環?
final= [[]]
for i in array_list:
final.extend([sublist + [i] for sublist in final])
return final
如果您嘗試遍歷最終你擴展它,它創建了一個無限循環。因爲每次你到下一個元素,你都會添加另一個元素,所以你永遠不會到達列表的末尾。
如果要將內循環作爲for循環而不是列表理解,則需要遍歷最終的副本。
final = [[]]
for i in [1, 2, 3]:
for sublist in final[:]:
final.extend([sublist + [i]])
您的解決方案似乎是一個很好的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)]))
此代碼也似乎給出與您的代碼相同的結果。
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]
你是什麼意思「典型的循環」? –
您想要將for循環重寫爲for循環嗎? – Carcigenicate
第二個循環是使用「單行」for循環完成的。我想實現它像循環的第一個。我試過了,但我得到了內存錯誤 – mike991