列表生成式


今天在復習列表運算的時候,一直納悶python為什么對列表元素操作這么麻煩,無意間看到“列表生成式”,居然發現了新大陸,迫不及待research一番。簡短的一句,優美有藝術 


摘要:生成列表,可用中括號 [ ]或 list()

對列表里面的元素操作,並生成一個新列表的方法:

(一)for遍歷列表中的元素,並進行操作后,逐一插入空列表,形成一個新的列表:

(1)原始列表為一個時:

1 a = [......]    #原始列表
2 ls = []
3 for i in a:
4     t = ......  #對元素進行操作,並將每次的結果賦值給t
5     ls.append(t)    #將每次得到的元素b插入空列表中

(2)原始列表為多個時:

1 a = [......]    #原始列表
2 b = [......]   #原始列表
3 ls = []
4 for i in range(0,k):    #k為原始列表的元素個數減1
5     t = ..a[i]..b[i]..  #索引各原始列表,以便得到里面的元素,並對元素進行操作,將每次的結果賦值給t
6     ls.append(t)    #將每次得到的元素t插入空列表中
7 print(ls)

(二)用“列表生成式”:[ 返回值  for...in...   if...]  # if 判斷語句有需要才用

Example1:

a = [1,2,3]

b = [ 'A' , 'B' , 'C' ]

生成 ls = [ 'A1' , 'B2' , 'C3 ']

方法一:

1 a = [1,2,3]    #原始列表
2 b = ['A','B','C']   #原始列表
3 ls = []
4 for i in range(0,3):    #獲取0,1,2,用作原始列表的下標,索引原始列表的元素,以便於操作
5     t = b[i] + str(a[i])  #int和str不能直接拼接,先將int轉為str
6     ls.append(t)    #將每次得到的元素b插入空列表中
7 print(ls)

方法二:

1 a = [1,2,3]    #原始列表
2 b = ['A','B','C']   #原始列表
3 ls = [j+str(i) for i,j in zip(a,b)]
4 print(ls)
Analysis:

① zip(a,b)的結果:(1,'A')  (2,'B')  (3,'C')

for i,j in zip(a,b):用 i 遍歷zip(a,b)中的a,而 j 遍歷 b。即 i 遍歷上面三個元組的第一個元素,j 遍歷第二個元素。為了美觀,建議用 for (i,j) in zip(a,b)。這樣更直觀地看出兩個括號的元素“一一對應”

 

Example2:

 a = [1,2,3]

 b = [4,5,6]

 求a和b對應元素的相加:不能 a+b(這只是將兩個列表進行拼接)

方法一:

1 a = [1,2,3]
2 b = [4,5,6]
3 ls = []
4 for i in range(0,3):
5     ls.append(a[i]+b[i])
6 print(ls)

analysis:

① 行3和行5不能缺少,否則只是實現了對應元素的相加,但結果不是列表形式:

②不能寫成:

1 a = [1,2,3]
2 b = [4,5,6]
3 for i in a:
4     for j in b:
5         print(i+j)

因為二層循環,每遍歷完內層for循環后,才跳出來進行一次外層的for循環。如 i = 1時,則 j = 4,5,6,而不是只等於4;i = 2時,則 j = 4,5,6,而不是只等於5

 方法二:

1 a = [1,2,3]
2 b = [4,5,6]
3 ls = [i+j for (i,j) in zip(a,b)]    #for前面是空格,不能用逗號
4 print(ls)

 

拓展:range()

range()產生一個范圍的數,但返回的是一個對象,如:range(1,11)

 而要查看“對象”的原始面貌,只能用list、set、tuple轉化為相應的類型。(但zip()產生的對象,還可以用*zip()解壓去看),對於range(),不能用中括號[ ]直接轉為列表(range()比較特殊):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM