純乾貨分享python推導式知識點
阿新 • • 發佈:2020-09-23
推導式的定義
推導式可以簡潔、高效地將散亂的資料組織起來存放到容器(列表、元組、字典、集合)中。
推導式是python簡潔、優雅、高效的完美體現。熟練掌握推導式,相信會對你編寫python程式有很大的幫助。
運用場景
推導式一般是配合迴圈使用的,通過推導式組織起來的資料可以很方便的迴圈處理,未經組織的零散資料處理起來會很麻煩。例如要找到很多數字中符合某種特徵的數字,放入列表中迴圈判斷處理就很方便。再如讀取日誌檔案,需要篩選出符合某種條件的記錄時,將資料組織成列表巢狀字典結構可讀性會很高、處理也更加方便。python程式設計師在編寫程式碼時幾乎每天都會用到推導式。
推導式的構造
推導式可以建立容器物件(列表、元組、字典、集合等等),推導式的基本構造請看下圖:
- 容器模板可以是表示式,可以存在多個變數。
- for語句可以巢狀多條for語句
- if語句可對容器模板中的變數進行篩選,滿足條件的才放入容器,不滿足條件的則捨棄。
推導式案例
以下會列舉非常多的程式碼示例,學習推導式的朋友一定要認真練習,在練習的過程中熟悉和掌握推導式。
不同容器的推導式:
# 列表推導式:0-9 l1 = [i for i in range(10)] # 列表推導式:0-9範圍內的偶數 l2 = [i for i in range(10) if i % 2 == 0] print(l1) print(l2) # 元組推導式:0-9 t1 = tuple(i for i in range(10)) # 不用tuple生成的是迭代器 # 元組推導式:0-9範圍內的偶數 t2 = tuple(i for i in range(10) if i % 2 == 0) # 不用tuple生成的是迭代器 print(t1) print(t2) # 集合推導式:0-9 l1 = {i for i in range(10)} # 集合推導式:0-9範圍內的偶數 l2 = {i for i in range(10) if i % 2 == 0} print(l1) print(l2) # 字典推導式,鍵是0-9,值是a-j d1 = {x: y for x, y in zip(range(10), 'abcdefghij')} # 字典推導式,鍵是0-9,值是a-j d2 = {x: y for x, y in zip(range(10), (chr(i) for i in range(97, 107)))} # 字典推導式,一行程式碼互換鍵和值 d3 = {y:x for x,y in d1.items()} print(d1) print(d2) print(d3) out: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) (0, 2, 4, 6, 8) {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} {0, 2, 4, 6, 8} {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j'} {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j'} {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9}
多條for巢狀推導式:
# 注意多條for巢狀時,先迴圈最左邊,再迴圈右邊 list1 = [(x, y) for x in range(5) for y in range(3)] list2 = [[x,y,z] for x in range(1,3) for y in range(1,4) for z in range(1,3)] print(list1) print(list2) out: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2)] [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], [1, 3, 1], [1, 3, 2], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2], [2, 3, 1], [2, 3, 2]]
容器模板:
list1 = [(x, y) for x in range(3) for y in range(3)] #list內的元素是tuple
list2 = [{x, y} for x in range(3) for y in range(3)] #list內的元素是set
list3 = [[x, y] for x in range(3) for y in range(3)] #list內的元素是list
print(list1)
print(list2)
print(list3)
out:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
[{0}, {0, 1}, {0, 2}, {0, 1}, {1}, {1, 2}, {0, 2}, {1, 2}, {2}]
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
容器模板中使用表示式:
# 建立字典,鍵值對是0:a..9:j
dict1 = {x: y for x, y in zip(range(10), 'abcdefghij')}
# 建立字典,鍵值對是0:a..9:j,將鍵轉換成字元型,將值從小寫字母轉換成大寫字母
dict2 = {str(x): y.upper() for x, y in zip(range(10), 'abcdefghij')}
print(dict1)
print(dict2)
out:
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j'}
{'0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G', '7': 'H', '8': 'I', '9': 'J'}
if篩選元素:
list1 = [chr(i) for i in range(97, 123)] # 建立列表,元素是26個小寫字母
list2 = [chr(i) for i in range(97, 123) if i % 2 == 0] # 建立列表,只保留ascii值是偶數的字母
list3 = [chr(i) for i in range(97, 123) if i % 2 == 1] # 建立列表,只保留ascii值是奇數的字母
list4 = [chr(i) for i in range(97, 123) if i < 97 + 13] # 建立列表,只保留26個字母的前面一半
list5 = [chr(i) for i in range(97, 123) if i >= 97 + 13] # 建立列表,只保留26個字母的後面一半
print(list1)
print(list2)
print(list3)
print(list4)
print(list5)
out:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
['b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z']
['a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
純乾貨分享python推導式知識點,如果覺得對你有啟發和幫助,歡迎關注、點贊、轉發,素質三連,不勝感謝。