在实验中经常会遇到将二维列表(数组)拉平到一维,如将 [[1, 1], [2, 2]] 转换为[1, 1, 2, 2],有以下几种操作方案:
1. 最简单的直接使用循环,如下:
list1 = [[1, 1], [2, 2]]
ans = [item for list in list1 for item in list]
print(ans) # [1, 1, 2, 2]
2. 使用itertools.chain(*iterables),能够去除iterable里的内嵌的一层iterable【注意:只能去除一层,多的层数去除不了,具体实例可看下面】,其中iterables为可迭代对象,如list, string, dict。
from itertools import chain
list1 = [[1, 1], [2, 2]]
ans = list(chain.from_iterable(list1))
print(ans) # [1, 1, 2, 2]
list2 = [[[1, 1]], [2, 2]]
ans2 = list(chain.from_iterable(list2))
print(ans2) # [[1, 1], 2, 2]
3. 使用a.flatten(),但是前提是要把list转换成numpy格式。【注意:无论array外面套了多少层,flatten()都会将其展平成一维。
import numpy as np
list1 = [[1, 1], [2, 2]]
list1 = np.array(list1)
ans = list1.flatten()
ans = ans.tolist()
4. sum(二维列表, [])函数小技巧,但这种方式也只能展开最外面一层,跟itertools.chain()类似。
list1 = [[1, 1], [2, 2]]
print(sum(list1, []))
为什么这种方式可以展平呢?我们来具体看下:
(1) 首先我们要知道在python中两个列表相加为多少?
[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]。没错列表相加等价于列表拼接。有同学肯定会想,这个操作跟extend是一样的,其实不同extend是在原对象的基础上进行添加元素,而+操作则会新建一对象
(2) 其次我们把sum拆解来看。sum的本质就是列表内元素相加,所以list1中的[1, 1], [2, 2]就会相加,得到[1, 1, 2, 2],然后得到的值又会和后面的空列表[]进行一次相加操作,也就是[1, 1, 2, 2] + [] = [1, 1, 2, 2],没变。所以会得到展开后的列表。
(3) 那sum后面能不能不放这个空列表[]呢?肯定不行。如果不放,则会默认[1, 1, 2, 2]和0相加,会报错,如下:
list1 = [[1, 1], [2, 2]]
print(sum(list1))
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'list'
相似博文将子列表相同位置的元素重组,指路:Python基础 - 将子列表相同位置的元素重组