簡體   English   中英

python列表理解加倍

[英]python list comprehension double for

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 是來自for elem in vic的列表中的列表
我不太明白numfor num in elem的開頭和結尾的用法。

python如何解釋這個?
它查看的順序是什么?

讓我們分解它。

一個簡單的列表理解:

[x for x in collection]

如果我們把它分成幾部分,這很容易理解: [A for 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

換句話說,在列表理解中,您只需將下一個循環添加到末尾,而不是向下一行並縮進。

回到火車的比喻:

Engine - Car - Car - Car ... Tail

什么是尾巴? 尾部在列表推導式中是一個特殊的東西。 不需要一個,但如果你有尾巴,尾巴是一個條件,看這個例子:

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

這將為您提供文件中的每一行,只要該行不以主題標簽 ( # ) 開頭,其他行就會被跳過。

使用火車“尾部”的訣竅是在您從所有循環中獲得最終“引擎”或“結果”的同時檢查它的真/假,上面的例子是一個常規的 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]
[5, 6, 7, 8, 9]

在常規 for 循環中:

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

5
6
7
8
9

列表理解文檔

提供列表推導式時,它由一個表達式組成,后跟至少一個for子句和零個或多個forif子句。 在這種情況下,新列表的元素是通過將每個 for 或 if 子句視為一個塊,從左到右嵌套,並在每次到達最里面的塊時計算表達式以生成一個列表元素而產生的元素.

換句話說,假設for循環是嵌套的。 從左到右閱讀您的列表理解可以嵌套為:

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

其中列表理解將使用最后一個最里面的塊作為結果列表的值。

您的代碼等於:

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

您可以將列表理解視為順序語句。 這適用於任何級別的forif語句。

例如,考慮帶有自己的if s 的 double 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]

這里的列表理解與:

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

如您所見,列表推導式只是forif沒有縮進但順序相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM