更新於 2024/12/16閱讀時間約 12 分鐘

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

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








分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.