列表生成式

2021-10-08 22:26:34 字數 4539 閱讀 8627

列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。

舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):

>>

>

list

(range(1

,11))

[1,2

,3,4

,5,6

,7,8

,9,10

]

但如果要生成[1x1, 2x2, 3x3, …, 10x10]怎麼做?方法一是迴圈:

>>

> l =

>>

>

for x in

range(1

,11):

....

.>>

> l[1

,4,9

,16,25

,36,49

,64,81

,100

]

但是迴圈太繁瑣,而列表生成式則可以用一行語句代替迴圈生成上面的list:

>>

>

[x * x for x in

range(1

,11)]

[1,4

,9,16

,25,36

,49,64

,81,100

]

寫列表生成式時,把要生成的元素x * x放到前面,後面跟for迴圈,就可以把list建立出來,十分有用,多寫幾次,很快就可以熟悉這種語法。

for迴圈後面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:

if在for後面,含義是篩選

>>

>

[x * x for x in

range(1

,11)if x %2==

0][4

,16,36

,64,100

]

還可以使用兩層迴圈,可以生成全排列:

有趣

>>

>

[m + n for m in

'abc'

for n in

'xyz'][

'ax'

,'ay'

,'az'

,'bx'

,'by'

,'bz'

,'cx'

,'cy'

,'cz'

]

三層和三層以上的迴圈就很少用到了。

運用列表生成式,可以寫出非常簡潔的**。例如,列出當前目錄下的所有檔案和目錄名,可以通過一行**實現:

>>

>

import os # 匯入os模組,模組的概念後面講到

>>

>

[d for d in os.listdir(

'.')

]# os.listdir可以列出檔案和目錄

['.emacs.d'

,'.ssh'

,'.trash'

,'adlm',,

'desktop'

,'documents'

,'downloads'

,'library'

,'movies'

,'music'

,'pictures'

,'public'

,'virtualbox vms'

,'workspace'

,'xcode'

]

for迴圈其實可以同時使用兩個甚至多個變數,比如dict的items()可以同時迭代key和value:

>>

> d =

>>

>

for k, v in d.items():

...print

(k,'='

, v)..

.y = b

x = a

z = c

因此,列表生成式也可以使用兩個變數來生成list:

>>

> d =

>>

>

[k +

'='+ v for k, v in d.items()]

['y=b'

,'x=a'

,'z=c'

]

練習生成

1、構建字典的 2 個列表相同

>>

> a =[1

,2,3

,4]>>

> b =

['ab'

,'ac'

,'ad'

]>>

>

dict

(zip

(a,b)

)>>

>

2、構建字典的 2 個列表不同(key比value多)

>>

> a =[1

,2,3

,4]>>

> c =

['aa'

,'ss'

]>>

>

dict

(zip

(a,c)

)>>

>

3、構建字典的 2 個列表不同(key比value少)

>>

> a =[1

,2,3

,4]>>

> d =

['fa'

,'fb'

,'fc'

,'fd'

,'fe'

]>>

>

dict

(zip

(a,d)

)dict4 =

print

(dict4)

最後把乙個list中所有的字串變成小寫:

>>

> l =

['hello'

,'world'

,'ibm',]

>>

>

[s.lower(

)for s in l]

['hello'

,'world'

,'ibm'

,]

if ... else

使用列表生成式的時候,有些童鞋經常搞不清楚if…else的用法。

例如,以下**正常輸出偶數:

>>

>

[x for x in

range(1

,11)if x %2==

0][2

,4,6

,8,10

]

但是,我們不能在最後的if加上else:

>>

>

[x for x in

range(1

,11)if x %2==

0else0]

file ""

, line 1

[x for x in

range(1

,11)if x %2==

0else0]

^syntaxerror: invalid syntax

這是因為跟在for後面的if是乙個篩選條件,不能帶else,否則如何篩選?

另一些童鞋發現把if寫在for前面必須加else,否則報錯:

>>

>

[x if x %2==

0for x in

range(1

,11)]

file ""

, line 1

[x if x %2==

0for x in

range(1

,11)]

^syntaxerror: invalid syntax

這是因為for前面的部分是乙個表示式,它必須根據x計算出乙個結果。因此,考察表示式:x if x % 2 == 0,它無法根據x計算出結果,因為缺少else,必須加上else:

if在for前面表示表示式計算必須跟else,在for後面表示篩選,沒有else

>>

>

[x if x %2==

0else

-x for x in

range(1

,11)]

[-1,

2,-3

,4,-

5,6,

-7,8

,-9,

10]

上述for前面的表示式x if x % 2 == 0 else -x才能根據x計算出確定的結果。

可見,在乙個列表生成式中,for前面的if … else是表示式,而for後面的if是過濾條件,不能帶else。

參考:

列表生成式

列表生成式 1生成列表 要生成list 1,2,3,4,5,6,7,8,9,10 我們可以用 range 1,11 range 1,11 1,2,3,4,5,6,7,8,9,10 但如果要生成 1x1,2x2,3x3,10x10 怎麼做?方法一是迴圈 l for x in range 1,11 l ...

列表生成式

列表生成式即list comprehensions,是python內建的非常簡單卻強大的可以用來建立list的生成式。舉個例子,要生成list 1,2,3,4,5,6,7,8,9,10 可以用list range 1,11 list range 1,11 1,2,3,4,5,6,7,8,9,10 但...

列表生成式

列表生成式,是 python 內建的一種極其強大的生成list的表示式。如果要生成乙個列表,可以用range 1,10 range 1,4 1,2,3 生成 1 1 2 2 3 3 10 10 怎麼做呢?可以使用迴圈 l for x in range 1,10 l 1,4,9,16,25,36,49...