如何在 Python 中扁平化列表
Aliaksei Yursha
2023年1月30日
2019年11月9日
列表展平或者列表扁平化是一種操作,其中我們獲取巢狀列表的列表並將其轉換為不包含巢狀列表的其他資料結構。它包括所有列表中最初巢狀的所有元素。這種資料結構稱為展平列表或扁平化列表。
原始列表只能在第一層巢狀中包含巢狀列表,例如 [[1, 2], [3, 4]]
。否則,它包含第二,第三和其他巢狀級別的列表,例如 [[[1], [2]], [3, 4]]
。這樣的列表被稱作包含深度巢狀的列表。
如果只想展平單個級別的巢狀,則將其稱為淺展平。如果我們想巢狀所有級別的巢狀,則稱其為深展平。
Python 列表淺展平
一種易於理解的方法是使用雙 for
迴圈。
第一個 for
迴圈遍歷巢狀列表。第二個 for
迴圈遍歷每個巢狀列表的元素,並將它們逐個追加到最終的展平列表。
>>> flat_list = []
>>> original_list = [[1, 2], [3, 4]]
>>> for l in original_list:
... for item in l:
... flat_list.append(item)
...
>>> flat_list
[1, 2, 3, 4]
上面的方法清晰易讀,但是 Python 的列表推導式式使我們可以僅一行實現相同的目標。在這裡,Python 的列表推導式方法將對你有很大的幫助。
>>> original_list = [[1, 2], [3, 4]]
>>> flat_list = [item for l in original_list for item in l]
>>> flat_list
[1, 2, 3, 4]
如果你本身並不需要平面列表,但希望能夠像訪問單個子資料結構一樣迭代所有子列表的所有元素,則可以使用 itertools.chain()
。
>>> import itertools
>>> original_list = [[1, 2], [3, 4]]
>>> iterator = itertools.chain(*original_list)
>>> for item in iterator:
... print(item)
...
1
2
3
4
如果你使用 Pandas(一種使用 Python 進行資料分析的開源軟體包),則它也有一種內建方法。
>>> from pandas.core.common import flatten
>>> original_list = [[1, 2], [3, 4]]
>>> flat_list = list(flatten(original_list))
>>> flat_list
[1, 2, 3, 4]
Python 列表深度展平
如上所述,如果我們具有深度巢狀的列表,則淺平整將不起作用。它只是將展開巢狀的第一級,如下面的例子所示。
>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = [item for l in deeply_nested_list for item in l]
>>> flat_list
[[1, 2], 3, 4, 5, 6]
為了做深展平,我們需要使用 PyPI
中的 iteration_utilities.deepflatten()
。
首先,安裝 PyPI 軟體包本身。
$ pip install iteration-utilities
然後將深層巢狀的列表展平。
>>> from iteration_utilities import deepflatten
>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = list(deepflatten(deeply_nested_list))
>>> flat_list
[1, 2, 3, 4, 5, 6]