4個(gè)Python推導式相關(guān)的開(kāi)發(fā)技巧
對于數據科學(xué),Python通常被廣泛地用于進(jìn)行數據的處理和轉換,它提供了強大的數據結構處理的函數,使數據處理更加靈活,這里說(shuō)的“靈活性”是什么意思?
這意味著(zhù)在Python中總是有多種方法來(lái)實(shí)現相同的結果,我們總是有不同的方法并且需要從中選擇易于使用、省時(shí)并能更好控制的方法。
要掌握所有的這些方法是不可能的。所以這里列出了在處理任何類(lèi)型的數據時(shí)應該知道的4個(gè)Python技巧。
列表推導式List Comprehension是創(chuàng )建列表的一種優(yōu)雅且最符合python語(yǔ)言的方法。與for循環(huán)和if語(yǔ)句相比,列表推導式在基于現有列表的值創(chuàng )建新列表時(shí)語(yǔ)法要短得多。因此,讓我們看看該特性如何獲得列表的副本。
使用列表推導式復制一個(gè)列表
有時(shí)需要創(chuàng )建現有列表的副本。最簡(jiǎn)單的答案是.copy(),它允許您將一個(gè)列表的內容復制到另一個(gè)(新)列表。
例如,一個(gè)由整數組成的列表original_list。
original_list = [10,11,20,22,30,34]
可以簡(jiǎn)單地使用.copy()方法復制此列表。
duplicated_list = original_list.copy()
列表推導式可以得到完全相同的輸出。復制列表是理解列表推導式的最佳案例。看看下面這段代碼。
duplicated_list = [item for item in original_list]
這里并不是說(shuō)復制列表使用列表推導式更好,而是說(shuō)對于介紹列表推導式的工作方式,這個(gè)案例是最好的。
接下來(lái),讓我們看看對列表的每個(gè)元素執行數學(xué)運算時(shí),列表推導式如何使工作變得簡(jiǎn)單。
列表中的元素相乘
最簡(jiǎn)單或直接的乘法方法是使用乘法運算符,即*
例如,想用一個(gè)標量(即數字5)乘以列表中的每一項。這里肯定不能使用original_list*5,因為它將創(chuàng )建列表的5個(gè)副本。
在這個(gè)場(chǎng)景中,最好的答案是列表推導式,如下所示。
original_list = [10,11,20,22,30,34] multiplied_list = [item*5 for item in original_list] # Output [50, 55, 100, 110, 150, 170]
這里的操作并不局限乘以一個(gè)數字??梢詫υ剂斜淼拿總€(gè)元素執行復雜的操作。例如,假設想計算每一項的平方根的立方,可以在一行中解決它。
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,因此在本例中需要在使用它之前導入它。與上面所示的內置函數類(lèi)似,還可以在列表的每個(gè)元素上使用用戶(hù)定義的函數。例如如下所示的簡(jiǎn)單函數。
def simple_function(item): item1 = item*10 item2 = item*11 return math.sqrt(item1**2 + item2**2)
可以對列表的每一項應用這個(gè)用戶(hù)定義的函數。
multiplied_list = [simple_function(item) for item in original_list]
# Output [148.66068747318505, 163.52675622050356, 297.3213749463701, 327.0535124410071, 445.9820624195552, 505.4463374088292]
列表推導式在實(shí)際場(chǎng)景中甚至更有用。通常在分析任務(wù)中需要從列表中刪除某種類(lèi)型的元素,例如消0護著(zhù)nan元素。列表推導式是完成這些任務(wù)的完美工具。
刪除列表中的元素
根據特定條件篩選數據是選擇所需數據集的常見(jiàn)任務(wù)之一,同樣的邏輯也用于列表推導式中。
假設你有下面提到的數字列表。
original_list = [10, 22, -43, 0, 34, -11, -12, -0.1, 1]
你想要從這個(gè)列表中只保留正值。因此,從邏輯上講,您希望只保留那些對條件項> 0求值為T(mén)RUE的項。
new_list = [item for item in original_list if item > 0] # Output [10, 22, 34, 1]
if子句用來(lái)刪除負值??梢允褂胕f子句應用任何條件來(lái)從列表中刪除任何項。
例如,當想刪除所有平方小于200的項時(shí)需要做的就是在列表綜合中提到條件項**2 > 200,如下所示。
new_list = [item for item in original_list if item**2 > 200]
# Output [22, -43, 34]
在處理真實(shí)的數據集時(shí),過(guò)濾列表項的條件可能要復雜得多,這種方法既快又易于理解。
使用dict()將兩個(gè)列表轉換為字典鍵值對
有時(shí)需要從兩個(gè)列表中的值創(chuàng )建字典。你可以使用字典推導式(dictionary comprehension) ,而不是一個(gè)一個(gè)地輸入,這是創(chuàng )建字典的一種優(yōu)雅而簡(jiǎn)潔的方法!它的工作原理與列表推導式完全相似,唯一的區別是——創(chuàng )建一個(gè)列表推導式時(shí),你將所有內容都包含在方括號中,例如[],而在字典推導式中,你將所有內容都包含在花括號中,例如{}。
假設有兩個(gè)列表—字段和詳細信息—如下所示。
fields = [‘name’, ‘country’, ‘a(chǎn)ge’, ‘gender’] details = [‘pablo’, ‘Mexico’, 30, ‘Male’]
一個(gè)簡(jiǎn)單的方法是使用像這樣的字典推導式:
new_dict = {key: value for key, value in zip(fields, details)} # Output {'name': 'pablo', 'country': 'Mexico', 'age': 30, 'gender': 'Male'}
這里需要理解的重要是函數zip是如何工作的。
在Python中,zip函數接受可迭代對象,如字符串、列表或字典作為輸入,返回它們聚合為元組。
因此,在本例中zip已經(jīng)從列表fields和details中形成了每個(gè)項的對。當字典推導式中使用key: value時(shí),只需將此元組解包為單獨的鍵-值對。
當使用Python中內置的dict()構造函數(用于創(chuàng )建字典)時(shí),這個(gè)過(guò)程甚至會(huì )變得更快,因為dict()比字典推導式至少快1.3倍!
所以我們需要將此構造函數與zip()函數一起使用,它的語(yǔ)法要簡(jiǎn)單得多——dict(zip(fields,details))。
總結
正如我一開(kāi)始提到的,Python非常靈活,因為有多種方法可以實(shí)現相同的結果。根據任務(wù)的復雜程度需要選擇最好的方法來(lái)實(shí)現它。
我希望這篇文章能對你有用。如果有任何其他方法可以做到我在本文中提到的同樣的事情,請告訴我。
作者:Suraj Gurav
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。