列表理解和for循环的区别

2024-03-28 18:11:39 发布

您现在位置:Python中文网/ 问答频道 /正文

stackoverflow中有一个标题完全相同的问题,但问题不是我想问的。我在解一个leetcode problem时,发现列表理解和for循环之间有一个非常有趣的区别。请比较以下两种方法。你知道吗

方法1

set1 = [[]]
num = [1,2,3]
for n in num:
    for s in set1:
        set1 += [ s + [n] ]
print(set1)

方法2

set1 = [[]]
num = [1,2,3]
for n in num:
    set1 += [ s + [n] for s in set1]
print(set1)

Approach 1挂起,Approach 2不挂起,并生成正确的结果。我认为原因是:
1) Approach 1为set1的每个成员向set1添加元素。因此,for循环永远不会结束,因为set1列表一直在增长。
2) Approach 2在处理set1中的所有元素之后更新set1。我理解这两种方法之间的区别是正确的吗?另外,我是否可以将[ s + [n] for s in set1]视为由以下伪代码生成的列表?你知道吗

tmp = []
for s in set1:
   tmp += [s + [n]]

Tags: 方法in元素标题列表forstackoverflownum
2条回答

问题是您正在修改在for s in set1循环中迭代的列表。这可以通过使用copy()来避免,以确保在列表的单独实例上迭代:for s in set1.copy()。您还可以约束循环的长度:for s in set1[:len(set1)]

我认为你的两种方法是不相等的。你知道吗

方法二是“在计算列表之后扩展set1”。因此,方法2的等效值如下所示:

set1 = [[]]
num = [1,2,3]
for n in num:
    tmp = []
    for s in set1:
        tmp += [ s + [n] ]
    set1 += tmp
print(set1)

你为什么接近我?它不是挂起,而是永远循环,因为你在遍历它的同时扩展了你的列表。你知道吗

    for s in set1:
        set1 += [ s + [n] ]

每次你得到set1的下一个元素,你的set1就会变长。你知道吗

在遍历元素时更改元素确实是个坏主意。别那么做。像伪代码那样创建中间变量更安全、更清晰。你知道吗

相关问题 更多 >