如何在 Python 中串聯兩個或多個列表
Aditya Raj
2023年1月30日
2019年11月4日
一個 Python 列表是一種資料結構,是具有元素的有序集合。
將兩個列表連線在一起的操作稱為串聯。你可以串聯兩個列表**,就地** - in-place
或非就地。
假設我們有兩個要串聯的列表,
list1 = [1, 2, 3, 4]
list2 = [5, 6, 7, 8]
我們可以有多種方法來串聯它們,但是當長度增加或串聯列表的數量增加時,它們的效能會有所不同。
我們將介紹這些不同的方法,併為你提供效能比較。
+
列表串聯方法
+
運算子可以連線兩個列表並返回一個新列表。
>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> result = list1 + list2
>>> result
[1, 2, 3, 4, 5, 6, 7, 8]
+=
串聯方法
+=
與上述方法類似,但是它將在列表就位之前更改列表中的資料。
>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> list1 += list2
>>> list1
[1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain
方法
itertools
模組中的 chain
將連續序列視為一個序列,
>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> import itertools
>>> result = list(itertools.chain(list1, list2))
[1, 2, 3, 4, 5, 6, 7, 8]
Information
itertools.chain
有一個備用建構函式- intertools.chain.from_iterable()
。它有一個可迭代的引數,其輸入是被懶惰評估的。extend()
方法
Python 列表 extend
方法通過附加來自可迭代物件的元素來擴充套件列表。
>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> list1.extend(list2)
>>> list1
[1, 2, 3, 4, 5, 6, 7, 8]
它還會就地更改現有列表的資料,而不是返回新列表。
[*a, *b]
unpack
方法
如 PEP-0448 中所述,從 Python 3.5 擴充套件了諸如*
可迭代 unpack
運算子和**
字典 unpack
運算子之類的 unpack
方法。
>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> result = [*list1, list2]
>>> result
[1, 2, 3, 4, 5, 6, 7, 8]
除非你要手動解壓縮每個列表,否則此方法不適用於 N 個列表的情況。
Warning
迭代解壓縮不能用於理解,如下所述。
>>> A = [1,2,3]
>>> B = [4,5,6]
>>> C = [7,8,9]
>>> [*t for t in [A,B,C]]
SyntaxError: iterable unpacking cannot be used in comprehension
まとめ
版本 | in-place ? |
|
---|---|---|
a + b |
– | No |
list(intertools.chain(a,b)) |
>= 2.3 | No |
[*a, *b] |
>= 3.5 | No |
a += b |
– | Yes |
a.extend(b) |
– | Yes |
我們使用 perfplot
模組來比較上述方法的效能。
正如圖表所示,a.extend(b)
和 a+b
方法幾乎是相同的效能,並在所有的方法中是最好的。list(chain(a,b))
方法的效能最差。