Python之 列表推導式與字典推導式

2022-06-24 04:33:14 字數 3322 閱讀 9067

四、列表推導式與字典推導式

在 python 中推導式是一種非常 pythonic 的知識,本篇將解答列表推導式與字典推導式相關的技術知識。

4.1 列表推導式

列表推導式可以利用列表,元組,字典,集合等資料型別,快速的生成乙個特定需要的列表。

語法格式如下:

[表示式 for 迭代變數 in 可迭代物件 [if 條件表示式]]

if 條件表示式 非必選,學完列表推導式之後,你可以發現它就是 for 迴圈的乙個變種語句,例如咱們現有乙個需求是將乙個列表中的所有元素都變成原值的 2 倍。

for 迴圈寫法

my_list = [1,2,3]

new_list =

for i in my_list:

print(new_list)

列表推導式寫法

nn_list = [i*2 for i in my_list]

print(nn_list)

是不是對比看就是將 for 迴圈語句做了變形之後,增加了乙個 ,不過需要注意的是,列表推導式最終會將得到的各個結果組成乙個新的列表。

再看一下列表推導式語法構成 nn_list = [i*2 for i in my_list] ,for 關鍵字後面就是乙個普通的迴圈,前面的表示式 i*2 其中的 i 就是 for 迴圈中的變數,也就是說表示式可以用後面 for 迴圈迭代產生的變數,理解這個內容列表推導式就已經掌握 9 成內容了,剩下的是熟練度的問題。

在將 if 語句包含進**中,執行之後,你也能掌握基本技巧,if 語句是乙個判斷,其中 i 也是前面迴圈產生的迭代變數。

nn_list = [i*2 for i in my_list if i>1]

print(nn_list)

這些都是一般技能,列表推導式能支援兩層 for 迴圈,例如下述**:

nn_list = [(x,y) for x in range(3) for y in range(3) ]

print(nn_list)

當然如果你想**加密(誰都看不懂你的**)**你的**,你可以無限套娃下去,列表推導式並沒有限制迴圈層數,多層迴圈就是一層一層的巢狀,你可以展開乙個三層的列表推導式,就都明白了

nn_list = [(x,y,z,m) for x in range(3) for y in range(3) for z in range(3) for m in range(3)]

print(nn_list)

當然在多層列表推導式裡面,依舊支援 if 語句,並且 if 後面可以用前面所有迭代產生的變數,不過不建議超過 2 成,超過之後會大幅度降低你**的可閱讀性。

當然如果你希望你**更加難讀,下面的寫法都是正確的。

nn_list = [(x, y, z, m) for x in range(3) if x > 1 for y in range(3) if y > 1 for z in range(3) for m in range(3)]

print(nn_list)

nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 and y > 1]

print(nn_list)

nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 if y > 1]

print(nn_list)

現在你已經對列表推導式有比較直觀的概念了,列表推導式對應的英文是 list comprehension,有的地方寫作列表解析式,基於它最後的結果,它是一種建立列表的語法,並且是很簡潔的語法。

有了兩種不同的寫法,那咱們必須要對比一下效率,經測試小資料範圍影響不大,當迴圈次數到千萬級時候,出現了一些差異。

import time

def demo1():

new_list =

for i in range(10000000):

def demo2():

new_list = [i*2 for i in range(10000000)]

s_time = time.perf_counter()

demo2()

e_time = time.perf_counter()

執行結果:

# for 迴圈

# 列表推導式

在 python3 中列表推導式具備區域性作用域,表示式內部的變數和賦值只在區域性起作用,表示式的上下文裡的同名變數還可以被正常引用,區域性變數並不會影響到它們。所以其不會有變數洩漏的問題。例如下述**:

x = 6

my_var = [x*2 for x in range(3)]

print(my_var)

print(x)

列表推導式還支援巢狀

參考**如下,只有想不到,沒有做不到的。

my_var = [y*4 for y in [x*2 for x in range(3)]]

print(my_var)大連**醫院

4.2 字典推導式

有了列表推導式的概念,字典推導式學起來就非常簡單了,語法格式如下:

直接看案例即可

my_dict =

print(my_dict)

得到的結果如下:

此時需要注意的是字典中不能出現同名的 key,第二次出現就把第乙個值覆蓋掉了,所以得到的 value 都是 1。

最常見的**還是下述的**,遍歷乙個具有鍵值關係的可迭代物件。

my_tuple_list = [('name', '橡皮擦'), ('age', 18),('class', 'no1'), ('like', 'python')]

my_dict =

print(my_dict)

4.3 元組推導式與集合推導式

其實你應該能猜到,在 python 中是具備這兩種推導式的,而且語法相信你已經掌握了。不過語法雖然差不多,但是元組推導式執行結果卻不同,具體如下。

my_tuple = (i for i in range(10))

print(my_tuple)

執行之後產生的結果:

at 0x0000000001de45e8>

使用元組推導式生成的結果並不是乙個元組,而是乙個生成器物件,需要特別注意下,這種寫法在有的地方會把它叫做生成器語法,不叫做元組推導式。

集合推導式也有乙個需要注意的地方,先看**:

my_set =

print(my_set)

因為集合是無序且不重複的,所以會自動去掉重複的元素,並且每次執行顯示的順序不一樣,使用的時候很容易暈掉。

python之列表推導式,字典推導式,集合推導式

列表推導式 表示式 for 變數 in 舊列表 或者 表示式 for 變數 in 舊列表 if 條件 names sc sfd sdfbgf dgnh b 過濾掉長度小於等於3的名字 print len name 3for name in names print name for name in n...

Python之列表推導式

如下是python官方文件中列表推導式部分的譯文,筆者對於該部分也是初學,只能從官方文件學起了。有不合適的地方還望指正,謝謝。python官網列表推導式部分 一 列表推導式 列表推導式提供了一種建立list的簡便方法。應用程式建立列表時,列表中的元素 於其他序列 可迭代物件或建立的乙個滿足一定條件的...

python之列表推導式篇

商品打折 python列表推導式 打折 newlistname expression for in var listname 大於 newlistname var for var in listname if condition newlistname 新生成的列表名稱 expression 表示式...