如何在 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]