python列表解析双重循环。

7 浏览
0 Comments

python列表解析双重循环。

vec = [[1,2,3], [4,5,6], [7,8,9]]
print [num for elem in vec for num in elem]      <----- 这里
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

这个让我感到困惑。

我明白for elem in vec中的elem是列表中的列表。

我不太理解numfor num in elem的用法。

Python如何解释这个?

它的处理顺序是什么?

0
0 Comments

问题的出现原因是因为在列表推导中使用了双重循环的语法,导致了嵌套的情况。列表推导的语法是由一个表达式后跟至少一个for子句和零个或多个for或if子句组成。当存在多个for子句时,列表推导会将其视为嵌套循环,从左到右进行嵌套。在这种情况下,新列表的元素是通过考虑每个for或if子句作为一个块,从左到右进行嵌套,并在达到最内层块时计算表达式来产生一个列表元素。

换句话说,可以假设for循环是嵌套的。从左到右阅读列表推导时,可以将其嵌套为:

for elem in vec:
    for num in elem:
        num           # the *single expression* from the spec

在这个例子中,列表推导将使用最后一个、最内层的块作为结果列表的值。

为了解决这个问题,可以使用嵌套的for循环来模拟列表推导的行为。首先,创建一个空列表来存储结果。然后,使用两个嵌套的for循环遍历vec中的元素。对于每个elem,再使用一个for循环遍历elem中的元素,并将每个num添加到结果列表中。最后,返回结果列表。

下面是使用嵌套的for循环来实现上述列表推导的示例代码:

result = []
for elem in vec:
    for num in elem:
        result.append(num)

使用这种方法,可以避免使用列表推导的复杂语法,而是使用简单的嵌套循环来达到相同的效果。这种方法更容易理解和调试,尤其是对于复杂的推导式。

0
0 Comments

Python的列表推导式是一种简洁而强大的语法结构,可以用来快速创建列表。列表推导式的基本形式是在一个方括号中放置一个表达式,然后在该表达式前面添加一个for循环,可以有多个循环,也可以在循环中添加if条件。

然而,在使用双重for循环和条件语句的时候,可能会出现一些问题。例如,考虑下面的代码:

vec = [[1,2,3], [4,5,6], [7,8,9]]
result = [i for e in vec if len(e)==3 for i in e if i%2==0]

这段代码的目的是从列表vec中筛选出长度为3的子列表,并且子列表中的偶数元素。然而,这种写法可能会让人感到困惑,因为它的结构并不像传统的嵌套循环和条件语句那样清晰。

为了更好地理解这段代码,我们可以将其转换为等价的传统写法:

result = []
for e in vec: 
    if len(e)==3:
        for i in e:
            if i%2==0:
                result.append(i)

通过对比这两种写法,我们可以看到列表推导式其实就是将for循环和if条件语句按照一定的顺序排列起来,去除了传统写法中的缩进。

这种简洁的写法让代码更加易读和易记,但同时也可能让初学者感到困惑。为了解决这个问题,我们可以尝试以下几种方法:

1. 仔细阅读和理解列表推导式的语法规则,熟悉其使用方法和特点。

2. 使用适当的命名和注释来解释列表推导式的含义和功能,以提高代码的可读性。

3. 如果列表推导式过于复杂,可以考虑将其拆分成多个简单的步骤,以便更好地理解和调试代码。

总之,列表推导式是一种非常方便和强大的语法结构,可以简化代码,提高效率。虽然它的写法可能会让初学者感到困惑,但通过适当的学习和实践,我们可以充分利用它的优势,并写出更加简洁和高效的代码。

0
0 Comments

python中的列表推导(list comprehension)是一种简洁而强大的语法,可以快速地生成新的列表。它的基本形式是`[A for B in C]`,其中A是最终列表中的元素,B是集合C中的每个元素。

当我们在列表推导中使用双重循环时,即`[x for y in collection for x in y]`,会出现一些特殊情况。我们希望最终的列表中包含A元素,而A元素位于B元素中,因此我们需要告诉列表推导这一点。

具体来说,A是最终列表中的元素,B是集合C中的每个元素,C是集合本身,D是集合E中的每个元素(在这种情况下,也是A),E是另一个集合(在这种情况下是B)。

这个逻辑与普通的for循环类似,可以这样表示:

for y in collection:
    for x in y:
        # receive x

为了更好地解释这个逻辑,让我们假设有一列火车。火车头(前部)始终存在(列表推导的结果),然后有任意数量的火车车厢,每个火车车厢都是形如`for x in y`的形式。

列表推导可以看作是下面这个普通的for循环的简化形式:

for b in a:
    for c in b:
        for d in c:
            ...
                for z in y:
                    # have z

换句话说,在列表推导中,你只需要在末尾添加下一个循环,而不是缩进到下一行。

回到火车的比喻上,火车头(Engine)- 车厢(Car)- 车厢(Car)- 车厢(Car)... - 尾部(Tail)。

尾部是列表推导中的一个特殊部分。你不一定需要尾部,但如果有一个尾部,它是一个条件。例如,`[line for line in file if not line.startswith('#')]`会将文件中不以井号(#)开头的每一行都包含在内,其他行则被跳过。

使用尾部的技巧是,在你获得最终结果(Engine)的同时,尾部的条件也会被同时检查。上面的例子在普通的for循环中可以表示为:

for line in file:
    if not line.startswith('#'):
        # have line

值得注意的是,尽管在火车比喻中只有一个尾部,但条件或尾部可以出现在每个“车厢”或循环之后。

例如:

z = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
[x for y in z if sum(y)>10 for x in y if x < 10]

在普通的for循环中可以表示为:

for y in z:
    if sum(y)>10:
        for x in y:
            if x < 10:
                print x

你的回答中暗示了在列表推导中只能在循环之后使用if语句,这是不正确的。你可以在列表推导的任何级别上使用if语句,甚至可以连续使用多个if语句(尽管这看起来有点无意义,直到你意识到它们是嵌套的)。但是,你不能将if语句作为第一个项目,第一个项目必须是一个for循环。

python中的列表推导是一种强大的语法,可以简化代码并快速生成新的列表。当我们在列表推导中使用双重循环时,需要注意正确理解循环嵌套的逻辑,并灵活运用if语句来实现更复杂的条件判断。

0