4 個 Python 推導式開發技巧
對于數據科學,Python通常被廣泛地用于進行數據的處理和轉換,它提供了強大的數據結構處理的函數,使數據處理更加靈活,這里說的“靈活性”是什么意思?
這意味著在Python中總是有多種方法來實現相同的結果,我們總是有不同的方法并且需要從中選擇易于使用、省時并能更好控制的方法。
要掌握所有的這些方法是不可能的。所以這里列出了在處理任何類型的數據時應該知道的4個Python技巧。
列表推導式List Comprehension是創建列表的一種優雅且最符合python語言的方法。與for循環和if語句相比,列表推導式在基于現有列表的值創建新列表時語法要短得多。因此,讓我們看看該特性如何獲得列表的副本。
1、使用列表推導式復制一個列表
有時需要創建現有列表的副本。最簡單的答案是.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]
這里并不是說復制列表使用列表推導式更好,而是說對于介紹列表推導式的工作方式,這個案例是最好的。
接下來,讓我們看看對列表的每個元素執行數學運算時,列表推導式如何使工作變得簡單。
2、列表中的元素相乘
最簡單或直接的乘法方法是使用乘法運算符,即*
例如,想用一個標量(即數字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元素。列表推導式是完成這些任務的完美工具。
3、刪除列表中的元素
根據特定條件篩選數據是選擇所需數據集的常見任務之一,同樣的邏輯也用于列表推導式中。
假設你有下面提到的數字列表。
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]
在處理真實的數據集時,過濾列表項的條件可能要復雜得多,這種方法既快又易于理解。
4、使用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))。