python教程—python列表理解双for-Python实用宝典

python教程—python列表理解双for

这是在骗我。 我知道elem是vic中elem的列表中的列表 我不太明白num和for num在elem中的用法。
    vec = [[1,2,3], [4,5,6], [7,8,9]] print [num for elem in vec for num in elem] <----- this >>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

这是在骗我。
我知道elem是vic
中elem的列表中的列表
我不太明白num和for num在elem中的用法。

python如何解释这个?
它看起来的顺序是什么?

回答

我们把它分解一下。

一个简单的列表:

    [x for x in collection]

这很容易理解,如果我们把它分成几个部分:[A代表B in C]

  • A是将出现在结果列表中的项
  • B是集合C中的每一项
  • C是集合本身。

这样,我们可以这样写:

    [x.lower() for x in words]

以便将列表中的所有单词转换为小写。


当我们用另一个类似的列表将其复杂化时:

    [x for y in collection for x in y] # [A for B in C for D in E]

这里,发生了一些特别的事情。我们希望最终的列表包含A项,而A项在B项中找到,因此我们必须告诉列表理解。

  • A是将出现在结果列表中的项
  • B是集合C中的每一项
  • C是集合本身
  • D是集合E中的每一项(在本例中,也是A)
  • E是另一个集合(本例中为B)

这个逻辑类似于普通的for循环:

    for y in collection: # for B in C: for x in y: # for D in E: (in this case: for A in B) # receive x # # receive A

为了对此进行扩展,并给出一个很好的例子+解释,假设有一列火车。

火车发动机(车头)总是在那儿(理解清单的结果)

然后,有任意数量的火车车厢,每个火车车厢的形式是:for x in y

列表理解可以是这样的:

    [z for b in a for c in b for d in c ... for z in y]

这就像有一个规则的for循环:

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

换句话说,在列表理解中,您只需在末尾添加下一个循环,而不是向下一行并缩进。

回到火车的类比:

发动机——汽车——汽车——汽车……尾巴

尾巴是什么?尾巴在列表理解中是一个特殊的东西。你不需要需要 1,但是如果你有一条尾巴,尾巴是一个条件,看这个例子:

    [line for line in file if not line.startswith('#')]

这将为您提供文件中的每一行,只要该行不是以hashtag(#)开头的,其他行就会被跳过。

使用火车“尾巴”的诀窍是,当你从所有循环中得到最终的“引擎”或“结果”时,同时检查它是否为真或假。

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

请注意:虽然在我对火车的类比中,火车尾部只有一个'tail',但是条件或'tail'可以是在之后的每一辆 'car'或loop…

例如:

    >>> 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] [5, 6, 7, 8, 9]

在常规循环:

    >>> for y in z: if sum(y)>10: for x in y: if x < 10: print x 5 6 7 8 9

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论