1. 程式人生 > 其它 >Python 炫技操作:推導式的五種寫法

Python 炫技操作:推導式的五種寫法

技術標籤:列表python程式語言生成器機器學習

點選藍色“Python空間”關注我丫

加個“星標”,每天一起快樂的學習

作者:寫程式碼的明哥
來源:Python程式設計時光

推導式(英文名:comprehensions),也叫解析式,是Python的一種獨有特性。

推導式是可以從一個數據序列構建另一個新的資料序列的結構體。

總共有四種推導式:

  1. 列表(list)推導式

  2. 字典(dict)推導式

  3. 集合(set)推導式

  4. 生成器推導式

1. 列表推導式

列表推導式的基本格式

new_list=[expressionfor_loop_expressionifcondition]

舉個例子。

我想找出一個數值列表中為偶數的元素,並組成新列表,通常不用列表推導式,可以這麼寫

old_list=[0,1,2,3,4,5]

new_list=[]
foriteminold_list:
ifitem%2==0:
new_list.append(item)

print(new_list)#output:[0,2,4]

一個簡單的功能,寫的程式碼倒是不少。

如果使用了列表推導式,那就簡潔多了,而且程式碼還變得更加易讀了。

>>>old_list=[0,1,2,3,4,5]
>>>
>>>new_list=[itemforiteminold_listifitem%2==0]
>>>print(new_list)#output:[0,2,4]
[0,2,4]

2. 字典推導式

字典推導式的基本格式,和 列表推導式相似,只是把 [] 改成了 {},並且組成元素有兩個:key 和 value,要用 key_expr: value_expr 表示。

new_dict={key_expr:value_exprfor_loop_expressionifcondition}

舉個例子。

我想從一個包含所有學生成績資訊的字典中,找出數學考滿分的同學。

old_student_score_info={
"Jack":{
"chinese":87,
"math":92,
"english":78
},
"Tom":{
"chinese":92,
"math":100,
"english":89
}
}

new_student_score_info={name:scoresforname,scoresinold_student_score_info.items()ifscores["math"]==100}
print(new_student_score_info)
#output:{'Tom':{'chinese':92,'math':100,'english':89}}

3. 集合推導式

集合推導式跟列表推導式也是類似的。唯一的區別在於它使用大括號{},組成元素也只要一個。

基本格式

new_set={exprfor_loop_expressionifcondition}

舉個例子

我想把一個數值列表裡的數進行去重處理

>>>old_list=[0,0,0,1,2,3]
>>>
>>>new_set={itemforiteminold_list}
>>>print(new_set)
{0,1,2,3}

4. 生成器推導式

生成器推導式跟列表推導式,非常的像,只是把 [] 換成了 ()

  • 列表推導式:生成的是新的列表

  • 生成器推導式:生成的是一個生成器

直接上案例了,找出一個數值列表中所有的偶數

>>>old_list=[0,1,2,3,4,5]
>>>new_list=(itemforiteminold_listifitem%2==0)
>>>new_list
<generatorobject<genexpr>at0x10292df10>
>>>next(new_list)
0
>>>next(new_list)
2

5. 巢狀推導式

for 迴圈可以有兩層,甚至更多層,同樣的,上面所有的推導式,其實都可以寫成巢狀的多層推導式。

但建議最多巢狀兩層,最多的話,程式碼就會變得非常難以理解。

舉個例子。

我想列印一個乘法表,使用兩個for可以這樣寫

foriinrange(1,10):
forjinrange(1,i+1):
print('{}x{}={}\t'.format(j,i,i*j),end='')
print("")

輸出如下

1x1=1
1x2=22x2=4
1x3=32x3=63x3=9
1x4=42x4=83x4=124x4=16
1x5=52x5=103x5=154x5=205x5=25
1x6=62x6=123x6=184x6=245x6=306x6=36
1x7=72x7=143x7=214x7=285x7=356x7=427x7=49
1x8=82x8=163x8=244x8=325x8=406x8=487x8=568x8=64
1x9=92x9=183x9=274x9=365x9=456x9=547x9=638x9=729x9=81

如果使用巢狀的列表推導式,可以這麼寫

>>>print('\n'.join([''.join(['%2d*%2d=%2d'%(col,row,col*row)forcolinrange(1,row+1)])forrowinrange(1,10)]))
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

我將自己的原創文章整理成了一本電子書,取名《Python修煉之道》,一共 400 頁,17w+ 字,目錄如下:

現在免費送給大家,在我的公眾號後臺回覆修煉之道即可獲取。
最後我最近建了一個讀者交流群,想加入的可以在公眾號後臺回覆「加群」即可~


????掃描上方二維碼即可關注