四、列表推導式與字典推導式
在 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 表示式...