如何将此列表理解重写为for循环?

时间:2016-10-04 18:44:09

标签: python

如何使用嵌套for循环而不是列表解析来重写它?

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


    return final

3 个答案:

答案 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]