4個Python推導式開發技巧

數據分析那些事
8 min readDec 19, 2022

--

對於資料科學,Python通常被廣泛地用於進行資料的處理和轉換,它提供了強大的資料結構處理的函式,使資料處理更加靈活,這裡說的“靈活性”是什麼意思?

這意味著在Python中總是有多種方法來實現相同的結果,我們總是有不同的方法並且需要從中選擇易於使用、省時並能更好控制的方法。

要掌握所有的這些方法是不可能的。所以這裡列出了在處理任何型別的資料時應該知道的4個Python技巧。

列表推導式List Comprehension是建立列表的一種優雅且最符合python語言的方法。與for迴圈和if語句相比,列表推導式在基於現有列表的值建立新列表時語法要短得多。因此,讓我們看看該特性如何獲得列表的副本。

使用列表推導式複製一個列表

有時需要建立現有列表的副本。最簡單的答案是.copy(),它允許您將一個列表的內容複製到另一個(新)列表。

例如,一個由整陣列成的列表original_list。


original_list = [10,11,20,22,30,34]

可以簡單地使用.copy()方法複製此列表。


duplicated_list = original_list.copy()

列表推導式可以得到完全相同的輸出。複製列表是理解列表推導式的最佳案例。
看看下面這段程式碼。


duplicated_list = [item for item in original_list]

這裡並不是說複製列表使用列表推導式更好,而是說對於介紹列表推導式的工作方式,這個案例是最好的。

接下來,讓我們看看對列表的每個元素執行數學運算時,列表推導式如何使工作變得簡單。

列表中的元素相乘

最簡單或直接的乘法方法是使用乘法運算子,即*

例如,想用一個標量(即數字5)乘以列表中的每一項。這裡肯定不能使用original_list*5,因為它將建立列表的5個副本。

在這個場景中,最好的答案是列表推導式,如下所示。


original_list = [10,11,20,22,30,34] multiplied_list = [item*5 for item in original_list] # Output [50, 55, 100, 110, 150, 170]

這裡的操作並不侷限乘以一個數字。可以對原始列表的每個元素執行復雜的操作。

例如,假設想計算每一項的平方根的立方,可以在一行中解決它。


multiplied_list = [math.sqrt(item)**3 for item in original_list] # Output [31.6227766016838, 36.4828726939094, 89.4427190999916, 103.18914671611546, 164.31676725154983, 198.25236442474025]

用於計算數字平方根的函式sqrt屬於庫math,因此在本例中需要在使用它之前匯入它。與上面所示的內建函式類似,還可以在列表的每個元素上使用使用者定義的函式。

例如如下所示的簡單函式。


def simple_function(item):
item1 = item*10
item2 = item*11
return math.sqrt(item1**2 + item2**2)

可以對列表的每一項應用這個使用者定義的函式。


multiplied_list = [simple_function(item) for item in original_list]

# Output
[148.66068747318505,
163.52675622050356,
297.3213749463701,
327.0535124410071,
445.9820624195552,
505.4463374088292]

列表推導式在實際場景中甚至更有用。通常在分析任務中需要從列表中刪除某種型別的元素,例如消0護著nan元素。列表推導式是完成這些任務的完美工具。

刪除列表中的元素

根據特定條件篩選資料是選擇所需資料集的常見任務之一,同樣的邏輯也用於列表推導式中。

假設你有下面提到的數字列表。


original_list = [10, 22, -43, 0, 34, -11, -12, -0.1, 1]

你想要從這個列表中只保留正值。因此,從邏輯上講,您希望只保留那些對條件項> 0求值為TRUE的項。

new_list = [item for item in original_list if item > 0]  # Output [10, 22, 34, 1]

if子句用來刪除負值。可以使用if子句應用任何條件來從列表中刪除任何項。

例如,當想刪除所有平方小於200的項時需要做的就是在列表綜合中提到條件項**2 > 200,如下所示。

 new_list = [item for item in original_list if item**2 > 200]

# Output
[22, -43, 34]

在處理真實的資料集時,過濾列表項的條件可能要複雜得多,這種方法既快又易於理解。

使用dict()將兩個列表轉換為字典鍵值對

有時需要從兩個列表中的值建立字典。你可以使用字典推導式(dictionary comprehension) ,而不是一個一個地輸入,這是建立字典的一種優雅而簡潔的方法!

它的工作原理與列表推導式完全相似,唯一的區別是 — — 建立一個列表推導式時,你將所有內容都包含在方括號中,例如[],而在字典推導式中,你將所有內容都包含在花括號中,例如{}。

假設有兩個列表 — 欄位和詳細資訊 — 如下所示。


fields = [‘name’, ‘country’, ‘age’, ‘gender’]
details = [‘pablo’, ‘Mexico’, 30, ‘Male’]

一個簡單的方法是使用像這樣的字典推導式:


new_dict = {key: value for key, value in zip(fields, details)}

# Output
{'name': 'pablo', 'country': 'Mexico', 'age': 30, 'gender': 'Male'}

這裡需要理解的重要是函式zip是如何工作的。

在Python中,zip函式接受可迭代物件,如字串、列表或字典作為輸入,返回它們聚合為元組。

因此,在本例中zip已經從列表fields和details中形成了每個項的對。當字典推導式中使用key: value時,只需將此元組解包為單獨的鍵-值對。

當使用Python中內建的dict()建構函式(用於建立字典)時,這個過程甚至會變得更快,因為dict()比字典推導式至少快1.3倍!

所以我們需要將此建構函式與zip()函式一起使用,它的語法要簡單得多 — — dict(zip(fields,details))。

總結

正如我一開始提到的,Python非常靈活,因為有多種方法可以實現相同的結果。根據任務的複雜程度需要選擇最好的方法來實現它。

我希望這篇文章能對你有用。如果有任何其他方法可以做到我在本文中提到的同樣的事情,請告訴我。

文章來源於:DeepHub IMBA

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

10種資料分析常用的統計學方法,附應用場景

總結了90條簡單實用的Python程式設計技巧

太實用了!4種方法教你輕鬆製作互動式儀表板!

花了一週,我總結出了120個常用資料分析指標與術語

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

回顧十週入門數據分析系列文:

關注數據君的臉書:

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!

--

--

數據分析那些事
數據分析那些事

Written by 數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

No responses yet