1. 程式人生 > 實用技巧 >Python推導式的五種寫法

Python推導式的五種寫法

推導式是可以從一個數據序列構建另一個新的資料序列的結構體。
推導式,也叫解析式,是Python的一種獨有特性。
總共有五種推導式:

1.列表(list)推導式

列表推導式的基本格式

new_list = [expression for_loop_expression if condition]

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

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

new_list = []
for item in old_list:
    if item % 2 == 0:
        new_list.append(item)

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

一個簡單的功能,寫的程式碼倒是不少。
如果使用了列表推導式,那就簡潔多了,而且程式碼還變得更加易讀了。

>>> old_list = [0,1,2,3,4,5]
>>>
>>> new_list = [item for item in old_list if item % 2 == 0]
>>> print(new_list) # output: [0, 2, 4]
[0, 2, 4]
  1. 字典推導式
    字典推導式的基本格式,和 列表推導式相似,只是把 [] 改成了 {},並且組成元素有兩個:key 和 value,要用 key_expr: value_expr 表示。
new_dict ={ key_expr: value_expr for_loop_expression if condition }

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

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

new_student_score_info = {name: scores for name, scores in old_student_score_info.items() if scores["math"] == 100}
print(new_student_score_info)
# output: {'Tom': {'chinese': 92, 'math': 100, 'english': 89}}
  1. 集合推導式
    集合推導式跟列表推導式也是類似的。唯一的區別在於它使用大括號{},組成元素也只要一個。
    基本格式
new_set = { expr for_loop_expression if condition }

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

>>> old_list = [0,0,0,1,2,3]
>>>
>>> new_set = {item for item in old_list}
>>> print(new_set)
{0, 1, 2, 3}
  1. 生成器推導式
    生成器推導式跟列表推導式,非常的像,只是把 [] 換成了 ()
    列表推導式:生成的是新的列表
    生成器推導式:生成的是一個生成器
    直接上案例了,找出一個數值列表中所有的偶數
>>> old_list = [0,1,2,3,4,5]
>>> new_list = (item for item in old_list if item % 2 == 0)
>>> new_list
<generator object <genexpr> at 0x10292df10>
>>> next(new_list)
0
>>> next(new_list)
2
  1. 巢狀推導式
    for 迴圈可以有兩層,甚至更多層,同樣的,上面所有的推導式,其實都可以寫成巢狀的多層推導式。
    但建議最多巢狀兩層,最多的話,程式碼就會變得非常難以理解。
    舉個例子。
    我想列印一個乘法表,使用兩個for可以這樣寫
for i in range(1, 10):
    for j in range(1, i+1):
        print('{}x{}={}\t'.format(j, i, i*j), end='')
    print("")

輸出如下

1x1=1    
1x2=2    2x2=4   
1x3=3    2x3=6   3x3=9   
1x4=4    2x4=8   3x4=12  4x4=16  
1x5=5    2x5=10  3x5=15  4x5=20  5x5=25  
1x6=6    2x6=12  3x6=18  4x6=24  5x6=30  6x6=36  
1x7=7    2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49  
1x8=8    2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64  
1x9=9    2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

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

>>> print('\n'.join([' '.join(['%2d *%2d = %2d' % (col, row, col * row) for col in range(1, row + 1)]) for row in range(1, 10)]))
 1 * 1 =  1
 1 * 2 =  2  2 * 2 =  4
 1 * 3 =  3  2 * 3 =  6  3 * 3 =  9
 1 * 4 =  4  2 * 4 =  8  3 * 4 = 12  4 * 4 = 16
 1 * 5 =  5  2 * 5 = 10  3 * 5 = 15  4 * 5 = 20  5 * 5 = 25
 1 * 6 =  6  2 * 6 = 12  3 * 6 = 18  4 * 6 = 24  5 * 6 = 30  6 * 6 = 36
 1 * 7 =  7  2 * 7 = 14  3 * 7 = 21  4 * 7 = 28  5 * 7 = 35  6 * 7 = 42  7 * 7 = 49
 1 * 8 =  8  2 * 8 = 16  3 * 8 = 24  4 * 8 = 32  5 * 8 = 40  6 * 8 = 48  7 * 8 = 56  8 * 8 = 64
 1 * 9 =  9  2 * 9 = 18  3 * 9 = 27  4 * 9 = 36  5 * 9 = 45  6 * 9 = 54  7 * 9 = 63  8 * 9 = 72  9 * 9 = 81