日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python基础】使用列表、字典和集合生成式来缩短代码

發布時間:2025/3/8 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python基础】使用列表、字典和集合生成式来缩短代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?作者 | Philip Wilkinson?

編譯 | VK?

來源 | Towards Datas Science

在使用Python將近一年的時間里,我經常遇到“生成式”這個詞,但我沒生成式它的確切含義或它所涵蓋的內容。

直到最近,我才發現,有了生成式后,我可以利用列表將我的代碼從多行縮短為一行。此外,這種代碼縮短方法不僅可以用于列表,還可以用于字典和集合。

本文試圖解釋生成式在列表、字典和集合的適用性,以及它們如何減少日常編程所需的代碼量。

首先,生成式是可以在一行中創建列表、字典和集合的代碼片段。這樣就不必為for循環使用多行,而且還減少了使用map()、filter()和reduce()函數的需要。

它們由方括號(根據你要創建的數據類型而定)組成,其中包含一個表達式,后跟一個for子句和一個或多個if子句。表達式本身可以是任何東西,這意味著你可以將許多不同的對象放入列表中,只要它們是可編輯的。因此,從減少使用的行數和增加可讀性的角度來探討這些可能對代碼產生的影響是值得的。

列表

在python中,只需將項目放在方括號([])內,用逗號分隔,就可以創建列表,如下所示。

list1?=?[1,?2,?3,?"hello",?7.0,?52]

它們通常用于多種目的的編程中,但在長格式中編寫或使用for循環進行編輯都會很麻煩。首先,在創建列表方面,小列表可能很容易以長格式打印出來,例如:

nums?=?[1,?2,?3,?4,?5,?6,?7,?8]

但當這個值變長時,即在0-50范圍內,甚至更長,它們可能會變得笨重。它們可以通過for循環使用range函數輕松創建,如下所示:

nums?=?[]for?i?in?range(1,?51):nums.append(i)print(nums)#?out:?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30,?31,?32,?33,?34,?35,?36,?37,?38,?39,?40,?41,?42,?43,?44,?45,?46,?47,?48,?49,?50]

但是我們可以使用列表生成式將其縮短為一行,并且不需要append()方法。

nums?=?[i?for?i?in?range(1,51)]print(nums)#?out:?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29,?30,?31,?32,?33,?34,?35,?36,?37,?38,?39,?40,?41,?42,?43,?44,?45,?46,?47,?48,?49,?50]

基本上,for循環放在一行中,同時初始化列表,從上面的示例中消除了對第一行和第二行代碼的需要。

當我們開始為添加到列表中的數字添加條件時,這就變得更加重要了,比如只允許偶數并且希望這些數字是平方的。同樣,也可以使用for循環生成,如下所示:

square_nums?=?[]for?x?in?range(1,26):if?x?%?2?==?0:square_nums.append(x**2)print(square_nums)#?out:?[4,?16,?36,?64,?100,?144,?196,?256,?324,?400,?484,?576]

但是,同樣可以使用列表生成式將其縮短為一行,從而減少對用于在范圍內循環、創建條件并將結果附加到原始列表的行的需要。

square_nums?=?[x**2?for?x?in?range(1,26)?if?x?%?2?==?0]print(square_nums)#out:?[4,?16,?36,?64,?100,?144,?196,?256,?324,?400,?484,?576]

在這里,數字的轉換在行首執行x**2,for循環在行中執行,對于x在范圍(1,26),條件在末尾執行,就好像x%2==0一樣。這本質上使代碼更具可讀性,因為所有操作都在一行中執行,并減少了生成相同輸出所需的代碼量。

這還可以減少append()、map()、filter()或reduce()方法在創建新列表時對現有列表進行操作的需要,再次降低代碼的復雜性并使其更具可讀性。

類似的例子是很容易獲得的,更多的信息可以很容易地通過其他文章在媒介,如這里和這里獲得。然而,值得注意的是,這些生成式也可以用于字典和集合。

字典

字典是一個無序的數據集合,可以改變和索引,使用大括號和鍵和值對編寫。在這里,鍵被用來訪問值,并且經常被用來存儲信息,這些信息對這些信息是有用的。下面提供了一個示例,例如用于存儲分數。

Grades?=?{"Steven":?57,"Jessica":?82,"William":?42,"Hussein":?78,"Mary":?65,}print(Grades)#?out:?{'Steven':?57,?'Jessica':?82,?'William':?42,?'Hussein':?78,?'Mary':?65}

與列表類似,有時也會很耗時,因此可以使用for循環和條件語句來構造,但可以更簡單地使用生成式來構造。

例如,對于我們在上面創建的列表,我們不僅想知道數字的平方,而且還想存儲原始數字,這樣我們就可以使用它輕松地查找它的平方值。然后,我們可以簡單地創建一個包含鍵值對的字典,其中key代表原始數字,value代表數字的平方。使用for循環:

#初始化空dict even_squared_dict?=?{}for?x?in?range(1,10):if?x?%?2?==?0:even_squared_dict[x]?=?x**2print(even_squared_dict)#?out:?{2:?4,?4:?16,?6:?36,?8:?64}

但是使用字典生成式:

even_sqaured_dict?=?{x:?x**2?for?x?in?range(1,10)?if?x?%?2?==0}print(even_squared_dict)#?out:?{2:?4,?4:?16,?6:?36,?8:?64}

本質上,這個和列表生成式之間的唯一區別是使用大括號來包含生成式,并將x放在冒號前面,以指示這表示鍵。

然后,還可以使用它來創建基于現有列表的字典。例如下面,字典生成式用于創建一個字典,其鍵為三位數的國家代碼,值為兩位數的國家代碼,其中兩位數代碼與三位數代碼的前兩位數相同。

ThreeCharCodes?=?["CAN",?"FIN",?"FRA",?"GAB",?"HKG",?"IMN","MCO",?"NPL"]cntryDict?=?{c:?c[:2]?for?c?in?threeCharCodes}print(cntryDict)#?out:?{'CAN':?'CA',?'FIN':?'FI',?'FRA':?'FR',?'GAB':?'GA',?'HKG':?'HK',?'IMN':?'IM',?'MCO':?'MC',?'NPL':?'NP'}

集合

最后,生成式也可以用于創建集合,集合是一種不同于列表或元組的數據類型,不能存儲同一元素的多次出現。

在這樣做時,它存儲無序值,初始化方法是將一個列表傳遞給set()或使用大括號來包含由逗號分隔的值(盡管空的花括號將初始化字典)。下面提供了一個例子:

Fruits1?=?set(["apple",?"banana",?"cherry",?"apple"]) print(Fruits1)Fruits2?=?{"orange",?"pear",?"grape",?"pear"} print(Fruits2)#?out:?{'apple',?'cherry',?'banana'}{'grape',?'pear',?'orange'}

從這里可以清楚地看到,盡管向集合傳遞了多個apple或pear值,但只生成了一個實例。同樣,可以使用for循環生成這些命令,如下所示:

import?randomnums?=?set([])for?x?in?range(25):y?=?random.randint(10,20)nums.add(y)print(nums)#?out:?{10,?12,?14,?15,?16,?17,?18,?20}

雖然25個隨機整數在10-20之間,但最終輸出僅包含8個唯一值,而不是列表中出現的25個值。同樣,使用對集合的生成式可以更簡潔地編寫這篇文章。

nums?=?{random.randint(10,20)?for?num?in?range(25)}print(nums)#?out:?{11,?12,?13,?14,?15,?16,?17,?19,?20}

因此,這種生成式與列表生成式的區別在于使用大括號,而不是包含生成式的方括號。

與列表和字典生成式類似,這也可以用于現有列表以生成集合。例如,如果我們想根據1.6的除法將公里改為英里,只需要唯一的值,并將其限制為小于100公里的值。

kms?=?[10,?12,?65,?40,?12,?75,?34,?65,?10,?10,?38,?100,?160,?200]miles?=?{d/1.6?for?d?in?kms?if?d?<?100}print(miles)#?out:?{0.625,?0.75,?2.5,?2.125,?4.0625,?4.6875,?2.375}

總結

因此,生成式可以很容易地用于創建新的列表、詞典和集合。使用這些可以減少生成它們所需的行數,并提高可讀性。它們可以用作append()、map()、filter()或reduce()函數的替換。

顯然,可以將它們放大以執行更復雜的生成式,例如使用lambda函數、嵌套列表生成式或多條件語句。然而,在這樣做時值得注意的是,生成式可能很快變得難以理解,在這種情況下,值得回到創建函數或for循環,以便在需要執行多個操作時提高可讀性。

原文鏈接:https://towardsdatascience.com/the-use-of-list-dictionary-and-set-comprehensions-to-shorten-your-code-66e6dfeaae13

?------------------------------------------------

看到這里,說明你喜歡這篇文章,請點擊「在看」或順手「轉發」「點贊」。

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):

總結

以上是生活随笔為你收集整理的【Python基础】使用列表、字典和集合生成式来缩短代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。