這12種方法輕鬆合併Python中的列表
導讀 | 我喜歡12這個數字,因為有太多的事情與12有關。一年有12個月;古代用12個時辰(地支)表示一天的時間。用一紀表示12年;希臘有12主神;黃道有12宮;撒迦利亞.西琴先生的《地球編年史》中描述的第12個天體(尼比魯);另外,朋友、愛人、戀人、家人的筆畫都是12。 |
我喜歡12這個數字,因為有太多的事情與12有關。一年有12個月;古代用12個時辰(地支)表示一天的時間。用一紀表示12年;希臘有12主神;黃道有12宮;撒迦利亞.西琴先生的《地球編年史》中描述的第12個天體(尼比魯);另外,朋友、愛人、戀人、家人的筆畫都是12。所以12註定是一個令人難忘的數字,現在我再為12加一種難忘的解釋:用12種方法合併Python列表。
其實Python語言合併兩個或多個列表的方法非常簡單,直接使用加號(+)即可。不過在很多場景下,並不太適合使用"+"。列表中的值由於某些原因是分散開的,或需要去重,或者正處於迭代中,所以本文將為讀者展示如果用多達12種方法合併兩個或多個列表。
list1 = [1, 2, 3] list2 = [4, 5, 6] result = list1 + list2 # [1, 2, 3, 4, 5, 6] print(result)
這個方法不用多解釋,直接加就完了,既然加兩個列表可以,加10000個列表當然也可以,或者放到迴圈裡不斷累加。
從Python 3.5開始,星號(*)就有了特殊的用途,將一個列表拆開,或將多個值組裝成元組。如果將星號用作列表元素,並且這個列表元素也是一個列表的話,那麼就會直接將列表中的值作為元素插入上一級的列表中,程式碼如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] result = list1 + list2 # [1, 2, 3, 4, 5, 6] print(result)
PS:雙星(**)可以拆裝字典,如果將單星和雙星作為函式的引數,那麼就是裝箱,可以將離散的值組裝成元組(單星)和字典(雙星),程式碼如下:
import itertools list1 = [1, 2, 3] list2 = [4, 5, 6] # 直接合並 # [1, 2, 3, 4, 5, 6] result = [item for item in itertools.chain(list1, list2)] print(result) # 合併兩個列表的同時,每一個列表元素的值加1 # [2, 3, 4, 5, 6, 7] result = [item + 1 for item in itertools.chain(list1, list2)] print(result)
前面兩種合併列表的方式固然比較簡單,但問題是,只能做到簡單的合併,如果要做更復雜的合併(如在合併的過程中加工特定的列表元素)就無法做到了。所以在這種情況下可以使用迭代的方式單獨處理每一個列表元素,我稱這種合併方式為可控合併,程式碼如下:
import itertools list1 = [1, 2, 3] list2 = [4, 5, 6] # 直接合並 # [1, 2, 3, 4, 5, 6] result = [item for item in itertools.chain(list1, list2)] print(result) # 合併兩個列表的同時,每一個列表元素的值加1 # [2, 3, 4, 5, 6, 7] result = [item + 1 for item in itertools.chain(list1, list2)] print(result)
透過chain類,可以將兩個或多個列表變成一個chain物件,然後再將chain物件轉換為list物件,程式碼如下:
from itertools import chain list1 = [1, 2, 3] list2 = [4, 5, 6] result = list(chain(list1, list2)) # [1, 2, 3, 4, 5, 6] print(result)
chain類構造方法的原型如下:
def __init__(self, *iterables)
顯而易見,構造方法的iterables引數使用了單星(*),所以可以接收任意多個列表引數,例如,chain(list1, list2, list3,list4,list5)是合法的,因此,本方法可以合併任意多個列表。
有一種特殊的合併列表方式,就是去重,也就是說,如果合併的兩個或多個列表中有重複的值,那麼只保留一個相同的值即可。其實就是將合併後的結果變成集合,因此,可以用集合來解決這個問題,程式碼如下:
list1 = [1, 2, 3] list2 = [4, 3, 6] result = list(set(list1 + list2)) # [1, 2, 3, 4, 6] print(result)
這種合併列表的方式儘管使用了加號(+),但還使用set,所以應該屬於一種新的合併方式,因為這種合併方式滿足了特殊的需求:去重。
前面的幾種方式都是使用了Python中的現成機制,現在來點複雜的:自定義轉換函式。
這種合併列表的方式涉及到如下幾種技術:
1. 自定義Python函式
2. 單星(*)作為函式引數
3. Python生成器(Generator)
4. 型別轉換實現
程式碼如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] list3 = [7, 8, 9] list4 = [10, 11, 12] list5 = ["hello", 20.1, True] # 合併函式,也是一個生成器 def merge(*iters): for it in iters: yield from it result = list(merge(list1, list2, 'abcd', [20, 21, 22],list3,list4,list5)) # [1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22, 7, 8, 9, 10, 11, 12, 'hello', 20.1, True] print(result)
這段程式碼的merge是一個生成器形式的合併函式,而且使用了單星(*)作為引數型別,所以可以傳入任意多個列表。本例合併了7個列表。其中'abcd'是一個字串形式的列表,每一個列表元素是單個字元。
Python簡直將for做到了極致,提供了for in表示式。要注意,這是表示式,不是語句。所以可以用在其他表示式中,例如,用for in表示式生成一個列表,程式碼如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] # 如果是字母,會輸出對應的ASCII result = [ord(item) if str(item).isalpha() else item for item in (list1 + list2 + list('abcd') + [20, 21, 22])] # [1, 2, 3, 4, 5, 6, 97, 98, 99, 100, 20, 21, 22] print(result)
這種方式適合於複製一個新的列表,而且可以在合併的過程中修改特定的列表值。
在合併列表時,如果希望一個列表本身被修改,那麼可以用這種方法。例如,合併A和B兩個列表後,A本身變成了最終的修改結果,也就是說,將B追加到A的後面。實現程式碼如下:
list1 = [1, 2, 3] list2 = [4, 5, 6] result = [] result.extend(list1) result.extend(list2) # [1, 2, 3, 4, 5, 6] print(result) # [1, 2, 3, 4, 5, 6] list1.extend(list2) print(list1)
如果希望不修改參與合併的列表,那麼可以定義一個空的列表。
Python有一個非常龐大的函式庫,其中不乏用於合併列表的函式,其中operator模組中的add函式就是其中之一,其實add內部使用了加號(+)合併列表,不過這也應該算是一種方法,因為以後add函式可能會使用其他的方式合併列表。程式碼如下:
import operator list1 = [1, 2, 3] list2 = [4, 5, 6] result = operator.add(list1, list2) # [1, 2, 3, 4, 5, 6] print(result)
前面介紹了一堆用於合併列表的API,其實列表類(list)本身就有一個__add__方法,用於合併兩個列表,程式碼如下:
list1 = [1,2,3] list2 = [4,5,6] result = list.__add__(list1, list2) # [1, 2, 3, 4, 5, 6] print(result)
來個最傳統的方式介紹了這麼多合併列表的方式,其實最傳統的還是一個元素一個元素新增,也就是列表的append方法。那麼可能很多同學要問,有這麼多好的方式,為啥要一個元素一個元素新增呢?豈不是影響效率?其實這也要看情況。例如,在一些場景,列表的值已經被拆開了(為了處理其他的業務),那麼就順道使用append方法挨個新增了,反正已經被拆開了,不加白不加。
實現程式碼如下:
list1 = [1,2,3] list2 = [4,5,6] result = [] for elem in list1: result.append(elem) for elem in list2: result.append(elem) # [1, 2, 3, 4, 5, 6] print(result)
其實Python中合併列表的方式也就這麼多,好像只有11種,前面都說了,有12種,為了湊夠12種,這裡請了一個外援,這就是NumPy,這個庫主要用於科學計算,對資料的處理比較強大,用NumPy合併Python列表的程式碼如下:
import numpy list1 = [1,2,3] list2 = [4,5,6] result = numpy.concatenate([list1,list2]).tolist() print(result)
由於numpy.concatenate函式返回了numpy.ndarray型別,所以要得到Python列表物件,還需要使用tolist方法進行轉換。NumPy是第三方庫,所以需要使用下面的 進行安裝。
pip install numpy
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2764754/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python3 列表list合併的4種方法Python
- python中合併表格的兩種方法Python
- Python中合併兩個列表常用的方法有哪些?Python
- Python 中一種輕鬆實現併發程式設計的方法Python程式設計
- Python語言合併列表元素常用的方法!Python
- 知識點:Python中的列表合併操作Python
- Python中列表去重常用的3種方法!Python
- Python 中刪除列表元素的三種方法Python
- 微課|玩轉Python輕鬆過二級(3.1節):列表常用方法Python
- Python中列表的方法Python
- python如何合併列表?怎麼做?Python
- Python合併字典的七種方式!Python
- python中pandas.Dataframe合併的方法有哪些?Python
- 5 種使用 Python 程式碼輕鬆實現資料視覺化的方法Python視覺化
- 如何輕鬆歸檔檔案?2種方法輕鬆建立歸檔檔案!
- 輕鬆搞定分組報表中的各種排序排序
- 合併PDF檔案怎樣做?分享兩種PDF合併方法
- Python多維列表(元組)合併成一維形式Python
- python列表的若干種拼接Python
- 哪種 Python IDE 最適合你?這裡有一份優缺點列表PythonIDE
- Flutter輕鬆實現Adobe全家桶Logo列表FlutterGo
- 掌握這些方法,輕鬆識破釣魚郵件的偽裝
- Python列表中set函式的使用方法!Python函式
- Python刪除列表元素的3種方法,你都會嗎?Python
- 淺談 OI 中各種合併操作
- 使用 flatMap() 將巢狀的列表合併成一個新的列表巢狀
- JavaScript中的12種迴圈遍歷方法JavaScript
- 注意這幾點,輕輕鬆鬆配置 Nginx + Tomcat 的叢集和負載均衡NginxTomcat負載
- 12.索引合併-indexMerge索引Index
- 頭腦王者,輕輕鬆鬆上王者,憑自己的Python知識上王者Python
- 批量給視訊銳化的方法,使用這個軟體輕鬆搞定
- python列表讀取的方法Python
- 輕鬆應對百萬併發的Nginx是怎麼處理這些網路事件的?Nginx事件
- 輕鬆檢測Golang併發的資料競爭Golang
- 飛項的5種應用方法,幫助你輕鬆學會專案管理!專案管理
- Python基礎之list列表寫入檔案的四種方法Python
- 簡單介紹四種Python 列表反轉顯示的方法Python
- 微課|玩轉Python輕鬆過二級(2.1.4節):列表、元組、字典、集合概述Python