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,...