Python 列表解析

2021-10-19 14:32:35 字數 4886 閱讀 9062

2.生成器表示式

x =

3y =

4if x > y:

res = x

else

: res = y

用單元表示式替換

x =

3y =

4res= x if x > y else y

三元表示式的最左邊和最右邊可以寫成任意表示式

x =

3y =

4res =

'aaa'

if x >y eles 'bbb'

[expression for item1 in iterable1 ]

expression 可為變數或者表示式

源**:

s=

for i in

'hello':)

)

等價於:

s=

[i.upper(

)for i in

'hello'

]

說明:for 迴圈得到的每乙個元素返回給 for 前面的 i 變數,然後執行 upper 函式,將執行結果以列表的形式返回~。相比於 for 迴圈,列表解析的語法由 c語言實現,效能會有所提公升

[expression for item1 in iterable1 if condition1

for item2 in iterable2 if condition2

.....

for itemn in iterablen if conditionn

]

等價於

類似於

res=

for item1 in iterable1:

if condition1:

for item2 in iterable2:

if condition2:..

....

for itemn in iterablen:

if conditionn:

示例:

lst =[1

,2,60

,67,34

,78,98

,70,89

]data=

[ i for i in lst if i>

50]

絕大多數的情況,列表解析僅使用一層迴圈,即

[expression for item in iterable if condition]
結合三元表示式

上面已經給出列表解析的語法,for 迴圈前面的 expression 可以是乙個變數,也可以是乙個表示式,看如下示例,列表中的×××(int)原樣取出,若是浮點型別(float),則進行四捨五入後取出:

a =[1

,2,3.2

,1.3

,5.9

]res =

[i if

isinstance

(i,int

)else

int(

round

(i))

for i in a]

res :[1

,2,3

,1,6

]

這裡 for 迴圈前的 expression 是乙個三元表示式,判斷語句在三元表示式中實現

全0列表

for 迴圈前的 expression 也可以是乙個 常量,例如要獲取乙個固定長度的,且都是某個值的列表:

lst =[0

for i in

range(10

)]# 長度為10,全為0 的列表

lst :[0

,0,0

,0,0

,0,0

,0,0

,0]

– 複雜的列表解析

列表解析多層 for 迴圈示例,讀取列表中每個單詞的字母,並生成乙個新的列表:

lst =

['hello'

,'kitty'

]res =

[l for word in lst for l in word]

res :

['h'

,'e'

,'l'

,'l'

,'o'

,'k'

,'i'

,'t'

,'t'

,'y'

]

如上示例可能一下子難以理解,根據列表解析的語法:

[expression for item1 in iterable1 if condition1

for item2 in iterable2 if condition2

.....

for itemn in iterablen if conditionn

]類似於res=

for item1 in iterable1:

if condition1:

for item2 in iterable2:

if condition2:..

....

for itemn in iterablen:

if conditionn:

如上示例使用 for 迴圈表示:

res =

for word in lst:

for l in word:

print

(res)

輸出結果:

['h'

,'e'

,'l'

,'l'

,'o'

,'k'

,'i'

,'t'

,'t'

,'y'

]

列表解析並沒有降低**的可讀性,且縮小了**量、提公升了效能,但是若其**現多層 for 迴圈巢狀,可能會降低**的可讀性,不易於理解

列表解析會一次性的生成所有的資料,然後載入到記憶體中,然後生成列表物件,這樣不適用迭代大量的資料,而生成器恰好解決了這個問題。

(expression for item1 in iterable1 if condition1

for item2 in iterable2 if condition2

.....

for itemn in iterablen if conditionn

)示例:>>

> g =

(i for i in

range

(100))

>>

> g

at 0x00000288d8c9a308

>

若使用生成器表示式,所有的資料不會一次性全部載入到記憶體中,而是按照從前向後的順序,用到乙個載入乙個。當資料量比較大時,更節省記憶體~

import time

start_time = time.time(

)g =

(i for i in

range

(100000000))

stop_time = time.time(

)print

('run time is %s'

%(stop_time - start_time)

)print

(next

(g))

print

(next

(g))

print

(next

(g))

輸出結果:

run time is

0.0# 得到生成器 g 的用時~01

2

同樣的資料量使用列表解析,會消耗相當長的時間,若是再加幾個0,程式可能就會卡住:

import time

start_time = time.time(

)lst =

[i for i in

range

(100000000)]

stop_time = time.time(

)print

('run time is %s'

%(stop_time - start_time)

)lst_iter = lst.__iter__(

)print

(next

(lst_iter)

)print

(next

(lst_iter)

)print

(next

(lst_iter)

)

輸出結果:

run time is

5.407538890838623

# 生成列表的時長01

2

當然生成器表示式也有缺點,由於生成器表示式返回的是乙個生成器,所以若要迭代所有的元素,只能從前往後挨個迭代;而列表解析返回的是列表,可以根據索引立即返回指定位置的元素

gen =

(i for i in

range

(100))

print

(gen[10]

)# 錯誤

lst =

[i for i in

range

(100)]

print

(lst[10]

)# 沒有問題

python列表解析

列表解析是乙個列表對映出另乙個列表,它的基本形式是乙個方括號裡面包含乙個for語句對乙個iterable物件迭代 expression for target1 in iterable1 if condition1 for targetn in iterablen if conditionn 上面是列...

python 列表解析

m 1,2,3 4,5,6 7,8,9 col2 row 1 for row in m 獲取列表m的每個元素的第二個元素的值組成的列表 print col2 print row 1 1 for row in m 獲取列表m的每個元素的第二個元素 1的值組成的列表 print row 1 for ro...

Python列表解析

語法 1.expression for iter val in iterable 2.expression for iter val in iterable if cond expr l i 2 for i in range 1,11 print l 1,4,9,16,25,36,49,64,81,...