[Python筆記] 新手指南:List 和Dictionary Comprehensions 的教學及應用

更新 發佈閱讀 12 分鐘

Whats's up guys! 我是 Rex,經過了兩個假日 (研究生放風時間),今天繼續跟大家分享我的 Python 筆記。

Introduction

在之前的討論中,我們聊到了像元組、字典、集合和列表這些資料結構,以及它們如何幫助我們有效地儲存和組織資料。現在,讓我們更進一步,探索列表和字典生成式(comprehensions)!這些技巧就像魔法一樣,能用簡潔又優雅的語法快速創建和轉換資料結構。掌握資料結構的基礎,可以幫助我們選擇最適合的工具,而熟悉生成式則能讓我們動態操作和生成資料,讓程式碼更具易讀性和更有效率。

優點:

  • 簡潔性:List/Dictionary comprehension 能將多行迴圈濃縮成一行代碼,大幅提升可讀性,讓程式碼更加簡潔直觀。
  • 效能:在某些情況下,List/Dictionary comprehension 的效能可能略勝於傳統迴圈。不過,根據我的經驗與網路上的討論,效能的優劣取決於迴圈內的具體邏輯,並非每次都一定更快,實際應用時還是要視情況而定。
  • 可讀性:透過簡單且清晰的語法,List/Dictionary comprehension 提供了一種優雅的方式來實現資料的轉換或過濾邏輯,讓代碼一目了然。

Coding Example

在正式介紹生成式之前,我想先讓讀者們比較一下 List/Dictionary comprehension 和傳統 for loop 在外觀上的差異。首先,我們先來看看 List Comprehension。假設我們需要產生一個列表,其中包含 1 到 10 之間所有偶數的平方。

# 傳統 for loop
squared_even_number = [] # 先創建一個空列表
for i in range(1, 11):
if i % 2 == 0:
squared_even_number.append(i**2)

# List Comprehension
squared_even_number = [i ** 2 for i in range(1, 11) if i % 2 == 0] # [4, 16, 36, 64, 100]

再來,我們來看看 Dictionary Comprehension。假設我們有一個字典,其中包含學生的名字和成績,我們想要生成一個新的字典,其中包括學生的名字和成績分級。如果分數大於或等於 90,則給予 A;在 80 到 90 之間給予 B;在 70 到 80 之間給予 C;其餘的則給予 D。

# 傳統 for loop
students = {"Alice": 85, "Bob": 70, "Charlie": 95, "Diana": 60}
grades = {} # 先創建一個空字典
for name, score in students.items():
if score >= 90:
grades[name] = "A"
elif score >= 80:
grades[name] = "B"
elif score >= 70:
grades[name] = "C"
else:
grades[name] = "D"

# Dictionary Comprehension
grades = {name: ("A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "D")
for name, score in students.items()} # {'Alice': 'B', 'Bob': 'C', 'Charlie': 'A', 'Diana': 'D'}

從上面兩個例子可以看出 List/Dictionary Comprehension 的簡潔和易讀性,但我相信對新手來說也可能有些複雜。因此,在開始教程之前,我先分享一個我覺得蠻實用的小抄。

我相信這個小抄算是一目瞭然,我就不多做解釋,那我們現在開始教程。

List Comprehension

  1. 篩選資料 (Data Filtering) - 你現在正在分析顧客的交易資料,你只想要列出交易量金額大於20的交易。
transactions = [12, 45, 23, 10, 8, 37]
high_value_transactions = [amount for amount in transactions if amount > 20]
# Output: [45, 23, 37]
  1. 資料轉換 (Data Transformation) - 你有一個紀錄攝氏溫度的列表,你想轉換成華氏溫度。
temperatures_celsius = [20, 25, 30, 35]
temperatures_fahrenheit = [temp * 9/5 + 32 for temp in temperatures_celsius]

# Output: [68.0, 77.0, 86.0, 95.0]
  1. 資料整合 (Data Aggregation and Summarization) - 你現在正在分析學生對某堂課每個作業的 feedback,你想要將這些資料整理成一個單獨的陣列。
assignments_feedback = [
["Assignment1", ["Good work", "Keep it up", "Well done"]],
["Assignment2", ["Needs improvement", "Excellent effort", "Keep it up"]],
["Assignment3", ["Great job", "Needs more effort", "Very insightful"]]
]

flat_feedback = [comment for assignment, feedback in assignments_feedback for comment in feedback]

"""
# Output: ['Good work',
'Keep it up',
'Well done',
'Needs improvement',
'Excellent effort',
'Keep it up',
'Great job',
'Needs more effort',
'Very insightful']
"""

Dictionary Example

  1. 資料篩選 (Data Filtering) - 你有一個學生名單以及他們對應的成績,你想建立一個字典,只顯示成績有過標準的學生名字以及成績。
students = {'Alice': 85, 'Bob': 76, 'Charlie': 90}
passed_students = {name: score for name, score in students.items() if score >= 80}
# Output: {'Alice': 85, 'Charlie': 90}
  1. 資料轉換 (Data Transformation) - 你有一個產品的價錢列表,你想將每個價錢打9折。
prices = [100, 200, 300]
discounted_prices = {i: price * 0.9 for i, price in enumerate(prices)}
# Output: {0: 90.0, 1: 180.0, 2: 270.0}
  1. 資料整合 (Data Aggregation and Summarization) - 你有一個列表,裡面記錄一個文章出現過的字詞,然後你想計算每個字詞出現的次數。
words = ['apple', 'banana', 'pear', 'apple', 'banana']
word_counts = {word: words.count(word) for word in set(words)}
# Output: {'banana': 2, 'apple': 2, 'pear': 1}​

以上就是List/Dictionary Comprehension 的教學內容。我個人非常常用這個功能,尤其是在資料分析中進行資料的轉換、篩選和整合時。希望今天提供的例子能幫助各位讀者更好地掌握這個技巧。和以往一樣,最後我會提供兩個 Coding Question 和一個概念問題,希望透過這些練習,進一步加深大家對這個技巧的理解和應用。

Concept Question

  1. List/Dictionary comprehension 有哪些優點?在什麼情境下你會使用這個技巧?

Coding Question

  1. 請使用 List Comprehension 從 1 到 20 中篩選出所有的奇數,並計算每個奇數的平方。
  2. 假設我們有一個字典,裡面包含了一些城市的名稱和人口數量。請使用 Dictionary Comprehension 為每個城市計算人口的五個等級(大於 5 百萬為 'Very High', 介於 1 百萬到 5 百萬之間為 'High', 介於 500,000 到 1 百萬之間為 'Medium', 介於 100,000 到 500,000之間為 'Low',少於 100,000為 'Very Low')。
# Example Data
city_population = { 'Amsterdam': 800000, 'New York': 8000000, 'Tokyo': 14000000, 'London': 8900000, 'Sydney': 500000, 'Mumbai': 20000000, 'Beijing': 21000000, 'Shanghai': 24200000, 'Istanbul': 15000000, 'Mexico City': 9200000 }

Conclusion

今天的教學就到這裡啦!希望大家透過這篇文章對 List/Dictionary Comprehension 有更深入的了解。如果你對文章中提到的操作或應用有任何問題,歡迎在留言區討論,或者分享你使用這些函式解決問題的經驗!也別忘了試試我提供的練習題目喔!祝大家練習順利,我們下次見啦~

Reference








留言
avatar-img
CodingWRex的沙龍
1會員
7內容數
CodingWRex的沙龍的其他內容
2024/12/17
在這篇新手必學指南中,探索如何使用 Python 的 Lambda Function 來進行資料篩選和轉換操作。從篩選數字到調整產品價格,通過實際範例和練習題,幫助你更清晰地理解其應用以及主要優點,並學會如何在 Python 中高效處理資料。開始提升你的 Python 技能,掌握資料分析的基本技巧!
Thumbnail
2024/12/17
在這篇新手必學指南中,探索如何使用 Python 的 Lambda Function 來進行資料篩選和轉換操作。從篩選數字到調整產品價格,通過實際範例和練習題,幫助你更清晰地理解其應用以及主要優點,並學會如何在 Python 中高效處理資料。開始提升你的 Python 技能,掌握資料分析的基本技巧!
Thumbnail
2024/12/13
在這篇文章中,通過聖誕節主題來學習Python內建序列函式。介紹了enumerate(), zip(), sorted() 和 reversed()。示範了如何在迭代過程中追蹤索引和值、將多個序列合併成對、對可迭代對象進行排序和反向顯示等操作。這些函式簡化了代碼,提升了可讀性和效能,適合新手學習。
Thumbnail
2024/12/13
在這篇文章中,通過聖誕節主題來學習Python內建序列函式。介紹了enumerate(), zip(), sorted() 和 reversed()。示範了如何在迭代過程中追蹤索引和值、將多個序列合併成對、對可迭代對象進行排序和反向顯示等操作。這些函式簡化了代碼,提升了可讀性和效能,適合新手學習。
Thumbnail
2024/12/12
在這篇Python筆記中,我們將探索如何使用元組來管理地理資訊數據。元組是一種有序且不可變的資料結構,非常適合用於儲存地理座標等固定不變的資料。通過實際的Coding Example,我們將展示如何定義元組、進行解包操作,並如何利用元組來簡化地理資訊的管理和處理。
Thumbnail
2024/12/12
在這篇Python筆記中,我們將探索如何使用元組來管理地理資訊數據。元組是一種有序且不可變的資料結構,非常適合用於儲存地理座標等固定不變的資料。通過實際的Coding Example,我們將展示如何定義元組、進行解包操作,並如何利用元組來簡化地理資訊的管理和處理。
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
入門一個新知識時,筆記卡片的構造方式十分重要。 雖然我也曾經排斥直接引用他人的段落,但摳過來的內容可以為我們提供初步的了解。 利用筆記卡片建立自己的知識架構,可助於更深入地學習。
Thumbnail
入門一個新知識時,筆記卡片的構造方式十分重要。 雖然我也曾經排斥直接引用他人的段落,但摳過來的內容可以為我們提供初步的了解。 利用筆記卡片建立自己的知識架構,可助於更深入地學習。
Thumbnail
這本書要提供讀者建立知識平台的方法 為什麼要用串聯法做閱讀方式,作者提到,閱讀天才和一般讀者的差異,第一個他們就是用串聯相同主題的書藉做為閱讀主軸,第二,閱讀天才會找到有興趣的主題書藉,用大量閱讀的方式建立自己的知識平台。 了解串聯閱讀法的用意,下一個步驟,就是設定閱讀目標,如同前面提到串聯閱讀法是
Thumbnail
這本書要提供讀者建立知識平台的方法 為什麼要用串聯法做閱讀方式,作者提到,閱讀天才和一般讀者的差異,第一個他們就是用串聯相同主題的書藉做為閱讀主軸,第二,閱讀天才會找到有興趣的主題書藉,用大量閱讀的方式建立自己的知識平台。 了解串聯閱讀法的用意,下一個步驟,就是設定閱讀目標,如同前面提到串聯閱讀法是
Thumbnail
詮釋是我們理解世界的關鍵途徑。 在閱讀中,我們總會遇到一些抓住自己注意力,引人入勝的點。這些能抓住我們注意力的點,稱為「注意力客體」。選擇特定的注意力客體,進一步深入研究,進行「詮釋」,是快速成為高手的關鍵。 根據我取得統計博士這5年期間的經驗,將「詮釋」應用於知識工作,有3個重要訣竅: 訣竅1 -
Thumbnail
詮釋是我們理解世界的關鍵途徑。 在閱讀中,我們總會遇到一些抓住自己注意力,引人入勝的點。這些能抓住我們注意力的點,稱為「注意力客體」。選擇特定的注意力客體,進一步深入研究,進行「詮釋」,是快速成為高手的關鍵。 根據我取得統計博士這5年期間的經驗,將「詮釋」應用於知識工作,有3個重要訣竅: 訣竅1 -
Thumbnail
生活跟工作當中,我們常常運用書籍閱讀、生活觀察、網路搜尋來做情報的蒐集,要提高情報蒐集的品質要做到速度、深度、廣度三點。 ➊速度:運用關鍵字搜尋,並且要搜尋第一手資訊。 ➋深度:做好主題式學習,內容要多樣性且高價值。 ➌廣度:連結生活與工作,提煉案例並作回饋分析。
Thumbnail
生活跟工作當中,我們常常運用書籍閱讀、生活觀察、網路搜尋來做情報的蒐集,要提高情報蒐集的品質要做到速度、深度、廣度三點。 ➊速度:運用關鍵字搜尋,並且要搜尋第一手資訊。 ➋深度:做好主題式學習,內容要多樣性且高價值。 ➌廣度:連結生活與工作,提煉案例並作回饋分析。
Thumbnail
身為一個程式學習者,如何用正確的心態與方法進行學習,將大大地影響你的學習效率、成果,還有學習過程中的心情。
Thumbnail
身為一個程式學習者,如何用正確的心態與方法進行學習,將大大地影響你的學習效率、成果,還有學習過程中的心情。
Thumbnail
有不少人由於缺乏相關的概念認知,加上身邊的人沒有發覺引導,因而在校園與職場上表現便顯得弱勢。
Thumbnail
有不少人由於缺乏相關的概念認知,加上身邊的人沒有發覺引導,因而在校園與職場上表現便顯得弱勢。
Thumbnail
艾兒莎的「打造知識體系」這個系列主題,會有連續幾篇文章,跟大家分享從知識的「輸入」、「統整」到「輸出」!上篇跟大家分享了知識的「輸入」,包含被動轉為主動的資訊挖掘、選書的十種方式等。這篇會分享怎麼「從資訊管道擴增概念庫」以及如何「讀懂一本書」!
Thumbnail
艾兒莎的「打造知識體系」這個系列主題,會有連續幾篇文章,跟大家分享從知識的「輸入」、「統整」到「輸出」!上篇跟大家分享了知識的「輸入」,包含被動轉為主動的資訊挖掘、選書的十種方式等。這篇會分享怎麼「從資訊管道擴增概念庫」以及如何「讀懂一本書」!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News