在第六天的復健文章中,我們講到了幾種創建串列 List 的方式,而今天要講的串列推導式 List Comprehension 是一種更為簡潔的方法。它比使用 for
迴圈將一個物件迭代出來,再將這些單一元素逐個塞入串列中,來得更加便捷。
# 串列推導式的語法
# i 是暫時的變數名稱
# iterable 是一個可迭代物件
# if expression 是如果有需要的話,可以再放入 if statement 過濾不必要的元素
[i for i in iterable if expression]
假設我們想將字串 string 轉換成串列,我們可以使用之前教過的 list()
類別創建:
# 使用 list()
word = 'Python'
word_list1 = list(word) # 將字串轉換為列表
print(type(word_list1)) # 列表
print(word_list1) # ['P', 'y', 't', 'h', 'o', 'n']
然而我們今天的重點是串列推導式,所以當然要知道怎麼使用 list comprehension:
# 第二種方法:列表推導式
word_list2 = [i for i in word]
print(type(word_list2)) # 串列
print(word_list2) # ['P', 'y', 't', 'h', 'o', 'n']
假設我們想創建一個裡面都是整數的串列:
# 生成數字
numbers = [i for i in range(11)] # 生成 0 到 10 的數字
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 也可以在迭代過程中進行各種數學運算,然後再生成一個串列
squares = [i * i for i in range(11)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 也可以生成包含元組的串列
numbers = [(i, i * i) for i in range(11)]
print(numbers) # [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
先前在串列推導式的語法有提及,裡面可以放入 if
expression 來設定條件過濾想要放入串列的元素:
# 生成偶數串列
even_numbers = [i for i in range(21) if i % 2 == 0] # 生成 0 到 21 的偶數
print(even_numbers) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# 生成奇數串列
odd_numbers = [i for i in range(21) if i % 2 != 0] # 生成 0 到 21 的奇數
print(odd_numbers) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
# 篩選出正的偶數,並生成串列
numbers = [-8, -7, -3, -1, 0, 1, 3, 4, 5, 7, 6, 8, 10]
positive_even_numbers = [i for i in range(21) if i % 2 == 0 and i > 0]
print(positive_even_numbers) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# 將三維串列展開成為一維串列
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_list = [number for row in list_of_lists for number in row]
print(flattened_list) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
會問出這個問題,代表說一定還有其他的推導式,而之前也說過,除了串列 List,我們也可以使用字典 Dictionary、集合 Set 等方式,來存放各種類型的資料。
# 語法
{key: value for item in iterable}
# 範例
squares = {x: x*x for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 篩選字典中的鍵值對
original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
filtered_dict = {key: value for key, value in original_dict.items() if value > 2}
print(filtered_dict) # {'c': 3, 'd': 4}
# 語法
{expression for item in iterable}
# 範例
unique_numbers = {x for x in [1, 2, 2, 3, 4, 4, 5]}
print(unique_numbers) # {1, 2, 3, 4, 5}
# 生成偶數集合
even_numbers = {x for x in range(10) if x % 2 == 0}
print(even_numbers) # {0, 2, 4, 6, 8}
今天想放空一下。