iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Python

初學者的 30 天 Python 復健課程系列 第 15

復健第十五天:成為串列大師吧——串列推導式 List Comprehension

  • 分享至 

  • xImage
  •  

串列推導式(List Comprehension)

第六天的復健文章中,我們講到了幾種創建串列 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 等方式,來存放各種類型的資料。

字典推導式(Dictionary Comprehension)

# 語法
{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}

集合推導式(Set Comprehension)

# 語法
{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}

後記

今天想放空一下。


上一篇
復健第十四天:自己刻出樂高積木 Modules 模組
下一篇
復健第十六天:聽起來好像很困難的 Lambda 函式
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言