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]

 

posted @ 2022-04-29 00:29  卷毛七号  阅读(903)  评论(0编辑  收藏  举报