for循環用膩了,試試列表生成式。

  • 2019 年 10 月 10 日
  • 筆記

在編寫程式或者查看別人的程式時,經常會遇到列表生成式,這個使用起來並不複雜,但是非常有用,使我們的程式碼更加簡潔靈活。很多python使用者並不太會使用它。今天,就給大家詳細講解列表生成式和生成器表達式的使用

 

一、列表生成式

優點:一行程式碼幾乎可以搞定所需要的任何列表

缺點:容易著迷,不易排錯,不能超過三個循環

  • 用列表推導式能構建的任何列表,用別的都可以構建,比如for循環
  • 列表推導式,最多不超過3個for循環。判斷只能用一個

 

1. 循環模式:模板:[經過加工的i for i in 可迭代對象]

使用for循環方法

li = []  for i in range(1,4):      li.append('還珠格格第'+str(i)+'')    print(li)                   #['還珠格格第1部', '還珠格格第2部', '還珠格格第3部']

第二種寫法

li = []  for i in range(1,4):      li.append('還珠格格第%s部' % i)    print(li)

上面的程式碼,可以一行搞定。用列表推導式就可以了

li = ['還珠格格第%s部' %i for i in range(1,4)]  print(li)    li = ['還珠格格第{}部'.format(i) for i in range(1,4)]         # 上下結果相同  print(li)

例:求1~10平方結果

li = [i ** 2 for i in range(1,11)]  print(li) 

執行輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2. 篩選模式:[經過加工的i for i in 可迭代對象 if 條件 篩選] 

30以內所有能被3整除的數
l3 = [i for i in range(1,31) if i % 3 == 0]  print(l3)                                 # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

30以內所有能被3整除的數的平方
li = [i**2 for i in range(1,31) if i % 3 == 0]  print(li)                                 # [9, 36, 81, 144, 225, 324, 441, 576, 729, 900]

找到嵌套列表中名字含有兩個'e'的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry']]  l4 = [name for i in names for name in i if name.count('e') == 2 ]  print(l4)                                 # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']

常用的是列表推導式

 

字典推導式

將一個字典的key和value對調

dict = {'a': 10, 'b': 34}  dict_frequency = {dict[k]: k for k in mcase}  print(dict_frequency) 

執行輸出:{10: 'a', 34: 'b'}

相當於

dict = {'a': 10, 'b': 34}  dict_frequency = {}  for k in dict:      dict_frequency[k]=dict[k]    print(dict_frequency) 

如果Key和value是一樣的,不適合上面的程式碼

集合推導式

計算列表中每個值的平方,自帶去重功能

squared = {x**2 for x in [1, -1, 2]}  print(squared)

執行輸出:{1, 4}
a = {1,1,4}  print(type(a)) 

執行輸出:<class 'set'>  結果是一個集合,它也是用{}表示的。

集合和字典是有區別的:

  有鍵值對的,是字典,比如{‘k1′:1,’k1’:2}

  沒有鍵值對的,是集合,比如{1,2,3,4}

 

二、生成器表達式

與列表推導式相同,只是將[ ]改為( )

l_obj = ('還珠格格第%s部' % i for i in range(1,4))  print(l_obj)

結果是一個生成器對象:<generator object <genexpr> at 0x000002DDBEBADE60>

取值使用__next__方法

l_obj = ('還珠格格第%s部' % i for i in range(1,4))    print(l_obj.__next__())  print(l_obj.__next__())  print(l_obj.__next__())

輸出結果:  還珠格格第1部  還珠格格第2部  還珠格格第3部

列表推導式:一目了然,占記憶體

生成器表達式: 不便看出,節省記憶體。