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

更新於 2024/12/16閱讀時間約 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
1會員
7內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
CodingWRex的沙龍 的其他內容
在這篇文章中,通過聖誕節主題來學習Python內建序列函式。介紹了enumerate(), zip(), sorted() 和 reversed()。示範了如何在迭代過程中追蹤索引和值、將多個序列合併成對、對可迭代對象進行排序和反向顯示等操作。這些函式簡化了代碼,提升了可讀性和效能,適合新手學習。
在這篇Python筆記中,我們將探索如何使用元組來管理地理資訊數據。元組是一種有序且不可變的資料結構,非常適合用於儲存地理座標等固定不變的資料。通過實際的Coding Example,我們將展示如何定義元組、進行解包操作,並如何利用元組來簡化地理資訊的管理和處理。
這篇文章介紹了集合,集合特點包括唯一元素和無順序特性,使其在資料處理中非常實用,例如去重和進行數學集合運算。文章以聖誕節為背景,舉例說明集合如何在計劃聖誕節旅行時幫助篩選重複的旅行地點和比較不同朋友的願望清單。通過使用Python集合,讀者可以更深入了解它們的應用和數學操作,並增強對集合概念的理解。
這次主題是字典。字典是一種靈活的數據結構,用於儲存鍵值對。它們提供快速的查找功能,適合管理數據。 文章展示了如何用字典來儲存和操作旅遊地點的中文和英文名稱,例如如何讀取、新增、修改和刪除項目。這些基本操作在資料分析和工作中至關重要。未來 Rex 會介紹更多資料結構的應用,歡迎繼續關注並留言交流!
在這篇文章中,Rex 分享了 Python 中的資料結構 - 列表。列表是一種可變且長度可變的序列,可以包含多種數據類型。文章介紹了列表的優點及其基本操作,包括新增、插入和刪除項目,並透過實際的旅遊清單範例來說明。適合對 Python 感興趣的初學者,瞭解列表的基本用法及其特性。
在這篇文章中,通過聖誕節主題來學習Python內建序列函式。介紹了enumerate(), zip(), sorted() 和 reversed()。示範了如何在迭代過程中追蹤索引和值、將多個序列合併成對、對可迭代對象進行排序和反向顯示等操作。這些函式簡化了代碼,提升了可讀性和效能,適合新手學習。
在這篇Python筆記中,我們將探索如何使用元組來管理地理資訊數據。元組是一種有序且不可變的資料結構,非常適合用於儲存地理座標等固定不變的資料。通過實際的Coding Example,我們將展示如何定義元組、進行解包操作,並如何利用元組來簡化地理資訊的管理和處理。
這篇文章介紹了集合,集合特點包括唯一元素和無順序特性,使其在資料處理中非常實用,例如去重和進行數學集合運算。文章以聖誕節為背景,舉例說明集合如何在計劃聖誕節旅行時幫助篩選重複的旅行地點和比較不同朋友的願望清單。通過使用Python集合,讀者可以更深入了解它們的應用和數學操作,並增強對集合概念的理解。
這次主題是字典。字典是一種靈活的數據結構,用於儲存鍵值對。它們提供快速的查找功能,適合管理數據。 文章展示了如何用字典來儲存和操作旅遊地點的中文和英文名稱,例如如何讀取、新增、修改和刪除項目。這些基本操作在資料分析和工作中至關重要。未來 Rex 會介紹更多資料結構的應用,歡迎繼續關注並留言交流!
在這篇文章中,Rex 分享了 Python 中的資料結構 - 列表。列表是一種可變且長度可變的序列,可以包含多種數據類型。文章介紹了列表的優點及其基本操作,包括新增、插入和刪除項目,並透過實際的旅遊清單範例來說明。適合對 Python 感興趣的初學者,瞭解列表的基本用法及其特性。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
ITS python認證內容含蓋六大主題
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
re 模組基本介紹 re 模組是 Python 用來處理正則表達式的標準模組。 正則表達式是一種用於描述字串模式的語法,可以用來匹配、搜尋、分割和替換字串中的特定模式。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
ITS python認證內容含蓋六大主題