嵌套列表合并为一维列表

今天看到一个题,觉得很有意思,就是一个列表里面嵌套了几层列表,那么如何将他们全部转换到一个列表里?可能应用有限,但确实很有趣,实现方式也很多,适合用来拓展下思维。

需求

我们有一个嵌套列表,他是这个样子的:

a = [[1, 2], 3, [4, 5], 'a', 'b', 'c']

然后需要将其转为一维列表:

a_new = [1, 2, 3, 4, 5, 'a', 'b', 'c']

方法一:递归

最简单的办法,就是递归。

  1. 把列表传进去
  2. 定义一个列表用来接收新的列表元素
  3. 开始循环遍历列表
  4. 如果当前元素不是列表,就直接附到新列表后面
  5. 如果当前元素为列表,进行递归操作
  6. 遍历结束后,返回新列表
    def expand_list1(nested_list, em=[]):
    for x in nested_list:
    if type(x) != list:
    em.append(x)
    else:
    expand_list1(x)
    return em

方法二:生成器+递归

在上面递归的思想下,在使用生成器的方法,不是列表和元组的直接使用yield语法糖,是列表或元组的直接递归即可。

def expand_list2(nested_list):
for item in nested_list:
if isinstance(item, (list, tuple)):
for sub_item in expand_list1(item):
yield sub_item
else:
yield item

方法三:字符串替换

可能这种是最好理解的,但不是最容易想到的。惯性思维下,都会先考虑列表的操作。
思路就是:先转成字符串,匹配两端的方括号,再替换里面的方括号

def expand_list2(nested_list):
return eval('[%s]' % repr(nested_list).replace('[', '').replace(']', ''))

方法四:列表推导式

说实话,这是第一种想到的办法,毕竟这个列表嵌套最多就有两层,但是失败了!看了报错,恍然大悟。我们的列表中,有个单独的int类型,他并不是一个可迭代对象

a = [[1, 2], 3, [4, 5], 'a', 'b', 'c']
def expand_list4(nested_list):
return [i for item in nested_list for i in item]

其实即使没有单独的int类型,还是可以实现需求的,但是,这样的话就会将字符串进行迭代,就是说如果有个单独的“abc”,也会被拆分成单独的字母。显然,这不是我们想要的效果。

这个题其实限制还是有点多,如果是单纯的数字,没有字符串的话,其实解法话有很多。

import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
import numpy as np
a = [[1,2,3], [5, 2, 8], [7,8,9]]
out = list(np.ravel(a))


还有什么好方法,请猛戳这里告诉我


-------------本文结束感谢您的阅读-------------