python 高階特性列表生成式

2021-09-28 19:22:06 字數 3487 閱讀 8156

列表生成式即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判斷,這樣我們就可以篩選出僅偶數的平方:

'''

'''>>

>

[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'

]

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

>>

> l =

['hello'

,'world'

,'ibm',]

>>

>

[s.lower(

)for s in l]

['hello'

,'world'

,'ibm'

,]

練習

如果list中既包含字串,又包含整數,由於非字串型別沒有lower()方法,所以列表生成式會報錯:

'''

'''>>

> l =

['hello'

,'world',18

,,none

]>>

>

[s.lower(

)for s in l]

traceback (most recent call last)

: file ""

, line 1

,in

file ""

, line 1

,in

attributeerror:

'int'

object has no attribute 'lower'

使用內建的isinstance函式可以判斷乙個變數是不是字串:

>>

> x =

'abc'

>>

> y =

123>>

>

isinstance

(x,str

)true

>>

>

isinstance

(y,str

)false

請修改列表生成式,通過新增if語句保證列表生成式能正確地執行:

# -*- coding: utf-8 -*-

l1 =

['hello'

,'world',18

,,none

]# 期待輸出:

['hello'

,'world',]

print

(l2)

run

小結

運用列表生成式,可以快速生成list,可以通過乙個list推導出另乙個list,而**卻十分簡潔。

python高階特性 列表生成式

本文 廖雪峰的官方 列表生成式即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,...

Python高階特性 列表生成式

列表生成式即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高階特性 切片 迭代 列表生成式

1行 能實現的功能,決不寫5行 請始終牢記,越少,開發效率越高。取list前三個數 list a b c d ans for i in range 0,3 print ans print list 0 3 l 0 3 表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個...