自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

合并Python列表的魔幻12法

開發(fā) 后端
我喜歡12這個數字,因為有太多的事情與12有關。一年有12個月;古代用12個時辰(地支)表示一天的時間。用一紀表示12年;希臘有12主神;黃道有12宮;撒迦利亞.西琴先生的《地球編年史》中描述的第12個天體(尼比魯);另外,朋友、愛人、戀人、家人的筆畫都是12。

 

[[387570]]

我喜歡12這個數字,因為有太多的事情與12有關。一年有12個月;古代用12個時辰(地支)表示一天的時間。用一紀表示12年;希臘有12主神;黃道有12宮;撒迦利亞.西琴先生的《地球編年史》中描述的第12個天體(尼比魯);另外,朋友、愛人、戀人、家人的筆畫都是12。所以12注定是一個令人難忘的數字,現在我再為12加一種難忘的解釋:用12種方法合并Python列表。

其實Python語言合并兩個或多個列表的方法非常簡單,直接使用加號(+)即可。不過在很多場景下,并不太適合使用"+"。列表中的值由于某些原因是分散開的,或需要去重,或者正處于迭代中,所以本文將為讀者展示如果用多達12種方法合并兩個或多個列表。

方法1:宇宙第一加號大法這是最簡單的合并Python列表的方法,代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 5, 6] 
  3.  
  4. result = list1 + list2 
  5. # [1, 2, 3, 4, 5, 6] 
  6. print(result) 

這個方法不用多解釋,直接加就完了,既然加兩個列表可以,加10000個列表當然也可以,或者放到循環(huán)里不斷累加。

方法2:自動拆箱和裝箱的星號大法

從Python 3.5開始,星號(*)就有了特殊的用途,將一個列表拆開,或將多個值組裝成元組。如果將星號用作列表元素,并且這個列表元素也是一個列表的話,那么就會直接將列表中的值作為元素插入上一級的列表中,代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 5, 6] 
  3.  
  4. result = list1 + list2 
  5. # [1, 2, 3, 4, 5, 6] 
  6. print(result) 

PS:雙星(**)可以拆裝字典,如果將單星和雙星作為函數的參數,那么就是裝箱,可以將離散的值組裝成元組(單星)和字典(雙星),代碼如下:

  1. import itertools 
  2. list1 = [1, 2, 3] 
  3. list2 = [4, 5, 6] 
  4. # 直接合并 
  5. # [1, 2, 3, 4, 5, 6] 
  6. result = [item for item in itertools.chain(list1, list2)] 
  7. print(result) 
  8. # 合并兩個列表的同時,每一個列表元素的值加1 
  9. # [2, 3, 4, 5, 6, 7] 
  10. result = [item + 1 for item in itertools.chain(list1, list2)] 
  11. print(result) 

方法3:可控合并,舍“迭代”其誰

前面兩種合并列表的方式固然比較簡單,但問題是,只能做到簡單的合并,如果要做更復雜的合并(如在合并的過程中加工特定的列表元素)就無法做到了。所以在這種情況下可以使用迭代的方式單獨處理每一個列表元素,我稱這種合并方式為可控合并,代碼如下:

  1. import itertools 
  2. list1 = [1, 2, 3] 
  3. list2 = [4, 5, 6] 
  4. # 直接合并 
  5. # [1, 2, 3, 4, 5, 6] 
  6. result = [item for item in itertools.chain(list1, list2)] 
  7. print(result) 
  8. # 合并兩個列表的同時,每一個列表元素的值加1 
  9. # [2, 3, 4, 5, 6, 7] 
  10. result = [item + 1 for item in itertools.chain(list1, list2)] 
  11. print(result) 

方法4:強行轉換的用處

通過chain類,可以將兩個或多個列表變成一個chain對象,然后再將chain對象轉換為list對象,代碼如下:

  1. from itertools import chain 
  2. list1 = [1, 2, 3] 
  3. list2 = [4, 5, 6] 
  4. result = list(chain(list1, list2)) 
  5. # [1, 2, 3, 4, 5, 6] 
  6. print(result) 

chain類構造方法的原型如下:

  1. def __init__(self, *iterables) 

顯而易見,構造方法的iterables參數使用了單星(*),所以可以接收任意多個列表參數,例如,chain(list1, list2, list3,list4,list5)是合法的,因此,本方法可以合并任意多個列表。

方法5:我不需要重復的值

有一種特殊的合并列表方式,就是去重,也就是說,如果合并的兩個或多個列表中有重復的值,那么只保留一個相同的值即可。其實就是將合并后的結果變成集合,因此,可以用集合來解決這個問題,代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 3, 6] 
  3. result = list(set(list1 + list2)) 
  4. # [1, 2, 3, 4, 6] 
  5. print(result) 

這種合并列表的方式盡管使用了加號(+),但還使用set,所以應該屬于一種新的合并方式,因為這種合并方式滿足了特殊的需求:去重。

方法6:生成器大法

前面的幾種方式都是使用了Python中的現成機制,現在來點復雜的:自定義轉換函數。

這種合并列表的方式涉及到如下幾種技術:

1. 自定義Python函數

2. 單星(*)作為函數參數

3. Python生成器(Generator)

4. 類型轉換實現

代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 5, 6] 
  3. list3 = [7, 8, 9] 
  4. list4 = [10, 11, 12] 
  5. list5 = ["hello", 20.1, True
  6. # 合并函數,也是一個生成器 
  7. def merge(*iters): 
  8.     for it in iters: 
  9.         yield from it 
  10. result = list(merge(list1, list2, 'abcd', [20, 21, 22],list3,list4,list5)) 
  11. # [1, 2, 3, 4, 5, 6, 'a''b''c''d', 20, 21, 22, 7, 8, 9, 10, 11, 12, 'hello', 20.1, True
  12. print(result) 

這段代碼的merge是一個生成器形式的合并函數,而且使用了單星(*)作為參數類型,所以可以傳入任意多個列表。本例合并了7個列表。其中'abcd'是一個字符串形式的列表,每一個列表元素是單個字符。

方法7:又看到for in表達式了

Python簡直將for做到了極致,提供了for in表達式。要注意,這是表達式,不是語句。所以可以用在其他表達式中,例如,用for in表達式生成一個列表,代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 5, 6] 
  3. # 如果是字母,會輸出對應的ASCII 
  4. result = [ord(item) if str(item).isalpha() else item for item in (list1 + list2 + list('abcd') + [20, 21, 22])] 
  5. # [1, 2, 3, 4, 5, 6, 97, 98, 99, 100, 20, 21, 22] 
  6. print(result) 

這種方式適合于復制一個新的列表,而且可以在合并的過程中修改特定的列表值。

方法8:自身也可以被修改

在合并列表時,如果希望一個列表本身被修改,那么可以用這種方法。例如,合并A和B兩個列表后,A本身變成了最終的修改結果,也就是說,將B追加到A的后面。實現代碼如下:

  1. list1 = [1, 2, 3] 
  2. list2 = [4, 5, 6] 
  3. result = [] 
  4. result.extend(list1) 
  5. result.extend(list2) 
  6. # [1, 2, 3, 4, 5, 6] 
  7. print(result) 
  8. # [1, 2, 3, 4, 5, 6] 
  9. list1.extend(list2) 
  10. print(list1) 

如果希望不修改參與合并的列表,那么可以定義一個空的列表。

方法9:Python函數庫是個好東西,到處都是寶藏

Python有一個非常龐大的函數庫,其中不乏用于合并列表的函數,其中operator模塊中的add函數就是其中之一,其實add內部使用了加號(+)合并列表,不過這也應該算是一種方法,因為以后add函數可能會使用其他的方式合并列表。代碼如下:

  1. import operator 
  2. list1 = [1, 2, 3] 
  3. list2 = [4, 5, 6] 
  4. result = operator.add(list1, list2) 
  5. # [1, 2, 3, 4, 5, 6] 
  6. print(result) 

方法10:遠在天邊,近在眼前

前面介紹了一堆用于合并列表的API,其實列表類(list)本身就有一個__add__方法,用于合并兩個列表,代碼如下:

  1. list1 = [1,2,3] 
  2. list2 = [4,5,6] 
  3.  
  4. result = list.__add__(list1, list2) 
  5. # [1, 2, 3, 4, 5, 6] 
  6. print(result) 

方法11:來個最傳統的方式介紹了這么多合并列表的方式,其實最傳統的還是一個元素一個元素添加,也就是列表的append方法。那么可能很多同學要問,有這么多好的方式,為啥要一個元素一個元素添加呢?豈不是影響效率?其實這也要看情況。例如,在一些場景,列表的值已經被拆開了(為了處理其他的業(yè)務),那么就順道使用append方法挨個添加了,反正已經被拆開了,不加白不加。

實現代碼如下:

  1. list1 = [1,2,3] 
  2. list2 = [4,5,6] 
  3. result = [] 
  4. for elem in list1: 
  5.     result.append(elem) 
  6. for elem in list2: 
  7.     result.append(elem) 
  8. # [1, 2, 3, 4, 5, 6] 
  9. print(result) 

方法12:合并方式不夠,外援來湊

其實Python中合并列表的方式也就這么多,好像只有11種,前面都說了,有12種,為了湊夠12種,這里請了一個外援,這就是NumPy,這個庫主要用于科學計算,對數據的處理比較強大,用NumPy合并Python列表的代碼如下:

  1. import numpy 
  2. list1 = [1,2,3] 
  3. list2 = [4,5,6] 
  4.  
  5. result = numpy.concatenate([list1,list2]).tolist() 
  6. print(result) 

由于numpy.concatenate函數返回了numpy.ndarray類型,所以要得到Python列表對象,還需要使用tolist方法進行轉換。NumPy是第三方庫,所以需要使用下面的命令進行安裝。

  1. pip install numpy 

 

責任編輯:武曉燕 來源: 極客起源
相關推薦

2024-09-09 16:30:08

Python編程

2023-03-31 09:09:16

OKRKPIKR

2011-09-16 13:22:44

Android應用IOS應用eCook

2023-09-15 16:55:04

2022-02-23 12:06:54

勒索軟件網絡攻擊網絡安全

2021-02-24 19:25:21

云計算開源科技

2011-08-31 13:45:38

Demon CamipadiPhone

2013-01-11 13:12:33

手機網游Wi-Fi

2019-08-29 11:03:54

Python編程語言軟件

2020-04-17 11:06:49

IO設備

2020-03-02 00:32:08

Python列表for循環(huán)

2017-05-24 15:50:08

PythonCPython

2013-01-21 10:47:00

手機游戲

2021-03-03 10:43:57

Python列表陷進

2010-03-15 12:36:26

Python列表

2010-03-11 15:56:15

Python列表

2022-07-20 12:24:38

Python列表集合

2024-06-28 09:52:47

列表Python

2024-05-28 14:45:00

2024-10-30 08:00:00

Python列表元組
點贊
收藏

51CTO技術棧公眾號