Python | 列表的扁平化处理
一、使用sum()函数,可展开两层的嵌套列表
a = [[1, 2, 3], [ 4, 5, 6], [7], [8, 9]]
out = sum(a, [])
print(out)
output:[1, 2, 3, 4, 5, 6, 7, 8, 9]
二、使用itertools
import itertools
a = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
out = list(itertools.chain.from_iterable(a))
print(out)
output:[1, 2, 3, 4, 5, 6, 7, 8, 9]
三、使用operator、reduce函数
import operator
from functools import reduce
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(reduce(operator.add, a))
a:[1, 2, 3, 4, 5, 6, 7, 8, 9]
上面方法可能只对二层列表有效,如果无法确定嵌套深度,有如下的方法:
四、可以使用递归函数来解决(万能方式)
data = [[[1],[2],[3]],[4,5],[[[[[[6]]]]]]] print(data) result = [] def take_out(arr): for item in arr: if isinstance(item,int): result.append(item) else: take_out(item) take_out(data) print(result) out:[[[1], [2], [3]], [4, 5], [[[[[[6]]]]]]] [1, 2, 3, 4, 5, 6]
data = [[[1],[2],[3]],[4,5],[[[[[[6]]]]]]] print(data) result = [] #存放最终结果 def nested(lst): #函数嵌套定义 for item in lst: if isinstance(item, list): nested(item) #递归子列表 else: result.append(item) #扁平化列表 nested(data) print(result) [[[1], [2], [3]], [4, 5], [[[[[[6]]]]]]] [1, 2, 3, 4, 5, 6]
五、使用标准库itertools中的chain()函数
from itertools import chain from copy import deepcopy data = [[[1],[2],[3]],[[4],[5],[6]]] print(data) result = deepcopy(data) while True: result = list(chain(*result)) if isinstance(result[0], int): break print(result) [[[1], [2], [3]], [[4], [5], [6]]] [1, 2, 3, 4, 5, 6]
六、扩展库numpy
import numpy as np data = [[[1],[2],[3]],[[4],[5],[6]]] print(data) temp_data = np.array(data) a = list(temp_data.reshape(temp_data.size,)) print(a) [[[1], [2], [3]], [[4], [5], [6]]] [1, 2, 3, 4, 5, 6]