[Python基礎]串列運算式(List Comprehension)

更新於 2024/01/17閱讀時間約 6 分鐘

[Python基礎]Lambda匿名函式

上一篇談論到Lambda匿名函式,跟串列運算式一樣都是可以創立新的列表,我個人是覺得會比mapfilter結合Lambda匿名函式,來得簡單易讀,但還是因人而異,看所在的群組對哪個接受度較高,就用哪個吧。

本文將介紹串列運算式應用,同樣的功能也用Lambda匿名函式的方法呈現,比較其差異性,看大家對哪一個接受度較高。

串列運算式(List Comprehension)

常見的應用是基於一個序列或 iterable(可疊代物件),將每一個元素經過某個運算的結果串接起來成為新的 list。

語法

new_list = [expression for item in iterable if condition]

expression: 評估為新列表的每個元素的運算式。

item: 可迭代對象(例如列表元組字典的鍵或值等)中的每個元素。

iterable: 可迭代對象,提供要遍歷的元素。

condition(可有可無): 一個條件,只有當條件為真時,expression 才會被應用。


程式範例

1. 基本的串列運算式:

for迴圈取出numbers每個元素,代入到x這個變數,在執行x**2這個運算式,將結果回傳收集起來並產新的列表來儲存這些結果。

numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers]
# 輸出: [1, 4, 9, 16, 25]
  • for x in numbers: 使用 for 迴圈遍歷 numbers 列表中的每個元素,用 x 來表示當前元素。
  • x**2: 對每個 x 的值計算平方。
  • 整個表達式 [x**2 for x in numbers] 表示將每個 x 的平方結果收集起來,形成一個新的列表。
串列運算式流程

串列運算式流程

這個串列運算式可以用一般的 for 迴圈表示如下:

numbers = [1, 2, 3, 4, 5]
squared = []

for x in numbers:
squared.append(x**2)

# 輸出: [1, 4, 9, 16, 25]
print(squared)

lambda 函式 + Map函式來表示如下:

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 輸出: [1, 4, 9, 16, 25]

2. 使用條件過濾元素:

串列運算式表示如下:

for迴圈取出numbers每個元素,代入到x這個變數,判斷x餘除為0,在執行x**2這個運算式,將結果回傳收集起來並產新的列表來儲存[4, 16]這個結果。

numbers = [1, 2, 3, 4, 5]
even_squares = [x**2 for x in numbers if x % 2 == 0]
# 輸出: [4, 16]
  • for x in numbers: 使用 for 迴圈遍歷 numbers 列表中的每個元素,用 x 來表示當前元素。
  • if x % 2 == 0: 使用 if 條件篩選,只有當 x 是偶數時,才進行後續的操作。
  • x**2: 對每個滿足條件的 x 的值計算平方。
  • 整個表達式 [x**2 for x in numbers if x % 2 == 0] 表示將每個滿足條件的 x 的平方結果收集起來,形成一個新的列表。

一般的 for 迴圈表示如下:

numbers = [1, 2, 3, 4, 5]
even_squares = []
for x in numbers:
if x % 2 == 0:
even_squares.append(x**2)

print(even_squares)
# 輸出: [4, 16]

lambda 函式 +mapfilter函式來表示如下:

numbers = [1, 2, 3, 4, 5]

# 定義匿名函式
square = lambda x: x**2

# 使用 map 函數應用匿名函式
even_squares = list(map(square, filter(lambda x: x % 2 == 0, numbers)))

# 輸出: [4, 16]
print(even_squares)

相較起來串列運算式是不是簡潔許多


串列運算式也支援多層迴圈,但多層迴圈在加條件式會讓別人不易理解,故建議不要使用,用以下範例來說明此現象。

x 和 y 的乘積,並僅包含乘積為偶數的元素

串列運算式表示:

# 生成二維列表,其中包含所有 x 和 y 的乘積,並僅包含乘積為偶數的元素
result = [(x, y, x * y) for x in range(1, 4) for y in range(1, 4) if x * y % 2 == 0]

# 輸出: [(1, 2, 2), (1, 4, 4), (2, 2, 4), (2, 4, 8), (3, 2, 6), (3, 4, 12)]
print(result)

一般的 for 迴圈表示如下:

result = []

for x in range(1, 4):
for y in range(1, 4):
if x * y % 2 == 0:
result.append((x, y, x * y))

print(result)
# 輸出: [(1, 2, 2), (1, 4, 4), (2, 2, 4), (2, 4, 8), (3, 2, 6), (3, 4, 12)]

這樣看起來在比較複雜的情況下不建議用串列運算式來表示了,用一般的for迴圈加if比較好閱讀程式碼超過兩層以上的運算式,就建議用一般for迴圈來表示吧。


總結

  1. 串列運算式:
    • 串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。
    • 可以包含多層迴圈和條件語句,以生成複雜的列表。
    • 生成複雜的列表就交給一般for迴圈來表示吧。
  2. lambda 函式:
    • lambda 函式用於創建匿名函式,通常用於簡單的操作。
    • 常與函數式編程中的函數(例如 map、filter)一起使用。


謝謝大家觀看~ 希望大家會喜歡,喜歡的話可以給愛心~追蹤一下,不會漏掉之後的文章喔~




avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
有別於上一篇for迴圈[Python基礎]流程控制for迴圈,while迴圈則常常被說是無限迴圈,若未到達跳脫的條件,是不會停止的。 在日常生活中,我們也常常用到這個概念,例如泡奶粉,要一直攪拌到粉都溶解了為止,其中的一直跟為止就等於while迴圈概念一樣,一直做到某個條件滿足了被觸發才停止。
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
有別於上一篇for迴圈[Python基礎]流程控制for迴圈,while迴圈則常常被說是無限迴圈,若未到達跳脫的條件,是不會停止的。 在日常生活中,我們也常常用到這個概念,例如泡奶粉,要一直攪拌到粉都溶解了為止,其中的一直跟為止就等於while迴圈概念一樣,一直做到某個條件滿足了被觸發才停止。
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。