[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
留言分享你的想法!
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
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
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