如何使用嵌套for循环而不是列表解析来重写它?
final= [[]]
for i in array_list:
final.extend([sublist + [i] for sublist in final])
return final
答案 0 :(得分:2)
如果在扩展时尝试迭代final,则会创建无限循环。因为每次转到下一个元素时,都会添加另一个元素,因此您永远不会到达列表的末尾。
如果你想将内循环作为for循环而不是列表理解,你需要遍历final的副本。
final = [[]]
for i in [1, 2, 3]:
for sublist in final[:]:
final.extend([sublist + [i]])
答案 1 :(得分:0)
您的解决方案看起来非常好.method public onReceivedSslError(Landroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V
.registers 4
.param p1, "view" # Landroid/webkit/WebView;
.param p2, "handler" # Landroid/webkit/SslErrorHandler;
.param p3, "error" # Landroid/net/http/SslError;
.prologue
.line 143
invoke-virtual {p2}, Landroid/webkit/SslErrorHandler;->proceed()V
.line 144
return-void
.end method
循环。使用for
的单行是可能的,但丑陋
itertools
编辑:
更漂亮:
list(itertools.chain(list(itertools.combinations(arr, i)) for i in range(len(arr) + 1)))
答案 2 :(得分:0)
此代码似乎也提供与代码相同的结果。
final = [[]]
for i in array_list:
for sublist in list(final):
final.extend([sublist + [i]])
return final
看起来你的代码采用了最后一次迭代的元素,并将它们与当前迭代的元素结合起来(参见下面的“示例”)。为了使用传统的for循环执行此操作,您需要防止在循环时更新循环的列表。我通过打破'final'列表变量的链接来做到这一点。这可以通过list()函数或通过切片来完成(然后你需要用Morgan提出的替换)。
示例强>
对于[1,2,3]的array_list,您将获得以下内容。每行(行除外)是'final'列表变量的新元素。
[]
--------------------------------
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]