代码之家  ›  专栏  ›  技术社区  ›  telliott99

扁平不规则列表

  •  377
  • telliott99  · 技术社区  · 15 年前

    是的,我知道这门课以前有讲过( here , here , here , here ,但据我所知,所有的解决方案,除了一个以外,都不能列在这样的列表上:

    L = [[[1, 2, 3], [4, 5]], 6]
    

    所需输出为

    [1, 2, 3, 4, 5, 6]
    

    或者更棒的是,一个迭代器。我看到的唯一适用于任意嵌套的解决方案是 in this question :

    def flatten(x):
        result = []
        for el in x:
            if hasattr(el, "__iter__") and not isinstance(el, basestring):
                result.extend(flatten(el))
            else:
                result.append(el)
        return result
    
    flatten(L)
    

    这是最好的型号吗?我忽略了什么吗?有什么问题吗?

    41 回复  |  直到 6 年前
        1
  •  331
  •   Cristian    8 年前

    使用生成器函数可以使您的示例更容易阅读,并可能提高性能。

    Python 2

    def flatten(l):
        for el in l:
            if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
                for sub in flatten(el):
                    yield sub
            else:
                yield el
    

    我用了 Iterable ABC 加入2.6。

    Python 3

    在python 3中, basestring 不再是,但您可以使用 str bytes 以达到同样的效果。

    这个 yield from 运算符一次从生成器返回一个项。这个 syntax for delegating to a subgenerator 在3.3中添加

    def flatten(l):
        for el in l:
            if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
                yield from flatten(el)
            else:
                yield el
    
        2
  •  46
  •   Josh Lee ZZ Coder    14 年前

    我的解决方案:

    def flatten(x):
        if isinstance(x, collections.Iterable):
            return [a for i in x for a in flatten(i)]
        else:
            return [x]
    

    稍微简洁一点,但基本相同。

        3
  •  33
  •   Alex Martelli    15 年前

    @unutbu的非递归解决方案的生成器版本,如@andrew在注释中要求的那样:

    def genflat(l, ltypes=collections.Sequence):
        l = list(l)
        i = 0
        while i < len(l):
            while isinstance(l[i], ltypes):
                if not l[i]:
                    l.pop(i)
                    i -= 1
                    break
                else:
                    l[i:i + 1] = l[i]
            yield l[i]
            i += 1
    

    此生成器的简化版本:

    def genflat(l, ltypes=collections.Sequence):
        l = list(l)
        while l:
            while l and isinstance(l[0], ltypes):
                l[0:1] = l[0]
            if l: yield l.pop(0)
    
        4
  •  32
  •   dansalmo    9 年前

    使用递归和duck类型的生成器(更新为python 3):

    def flatten(L):
        for item in L:
            try:
                yield from flatten(item)
            except TypeError:
                yield item
    
    list(flatten([[[1, 2, 3], [4, 5]], 6]))
    >>>[1, 2, 3, 4, 5, 6]
    
        5
  •  25
  •   unutbu    10 年前

    本版本 flatten 避免了python的递归限制(因此可以处理任意深度的嵌套iterables)。它是一个可以处理字符串和任意iterables(甚至是无限的iterables)的生成器。

    import itertools as IT
    import collections
    
    def flatten(iterable, ltypes=collections.Iterable):
        remainder = iter(iterable)
        while True:
            first = next(remainder)
            if isinstance(first, ltypes) and not isinstance(first, basestring):
                remainder = IT.chain(first, remainder)
            else:
                yield first
    

    下面是一些示例,演示它的用法:

    print(list(IT.islice(flatten(IT.repeat(1)),10)))
    # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
    print(list(IT.islice(flatten(IT.chain(IT.repeat(2,3),
                                           {10,20,30},
                                           'foo bar'.split(),
                                           IT.repeat(1),)),10)))
    # [2, 2, 2, 10, 20, 30, 'foo', 'bar', 1, 1]
    
    print(list(flatten([[1,2,[3,4]]])))
    # [1, 2, 3, 4]
    
    seq = ([[chr(i),chr(i-32)] for i in xrange(ord('a'), ord('z')+1)] + range(0,9))
    print(list(flatten(seq)))
    # ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H',
    # 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P',
    # 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X',
    # 'y', 'Y', 'z', 'Z', 0, 1, 2, 3, 4, 5, 6, 7, 8]
    

    虽然 压扁 可以处理无限生成器,不能处理无限嵌套:

    def infinitely_nested():
        while True:
            yield IT.chain(infinitely_nested(), IT.repeat(1))
    
    print(list(IT.islice(flatten(infinitely_nested()), 10)))
    # hangs
    
        6
  •  21
  •   samplebias    14 年前

    这里是我的递归flatten函数版本,它处理元组和列表,并允许您抛出任何位置参数组合。返回按顺序生成整个序列的生成器,arg by arg:

    flatten = lambda *n: (e for a in n
        for e in (flatten(*a) if isinstance(a, (tuple, list)) else (a,)))
    

    用途:

    l1 = ['a', ['b', ('c', 'd')]]
    l2 = [0, 1, (2, 3), [[4, 5, (6, 7, (8,), [9]), 10]], (11,)]
    print list(flatten(l1, -2, -1, l2))
    ['a', 'b', 'c', 'd', -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    
        7
  •  13
  •   clay    14 年前

    这是另一个更有趣的答案…

    import re
    
    def Flatten(TheList):
        a = str(TheList)
        b,crap = re.subn(r'[\[,\]]', ' ', a)
        c = b.split()
        d = [int(x) for x in c]
    
        return(d)
    

    基本上,它将嵌套列表转换为字符串,使用regex除去嵌套语法,然后将结果转换回(扁平的)列表。

        8
  •  10
  •   kev    12 年前
    def flatten(xs):
        res = []
        def loop(ys):
            for i in ys:
                if isinstance(i, list):
                    loop(i)
                else:
                    res.append(i)
        loop(xs)
        return res
    
        9
  •  7
  •   MSeifert    7 年前

    你可以使用 deepflatten 从第三方软件包 iteration_utilities :

    >>> from iteration_utilities import deepflatten
    >>> L = [[[1, 2, 3], [4, 5]], 6]
    >>> list(deepflatten(L))
    [1, 2, 3, 4, 5, 6]
    
    >>> list(deepflatten(L, types=list))  # only flatten "inner" lists
    [1, 2, 3, 4, 5, 6]
    

    它是一个迭代器,因此您需要迭代它(例如,用 list 或者在循环中使用它)。在内部,它使用迭代方法而不是递归方法,它被编写为C扩展,因此它可以比纯Python方法更快:

    >>> %timeit list(deepflatten(L))
    12.6 µs ± 298 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    >>> %timeit list(deepflatten(L, types=list))
    8.7 µs ± 139 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    >>> %timeit list(flatten(L))   # Cristian - Python 3.x approach from https://stackoverflow.com/a/2158532/5393381
    86.4 µs ± 4.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    >>> %timeit list(flatten(L))   # Josh Lee - https://stackoverflow.com/a/2158522/5393381
    107 µs ± 2.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    >>> %timeit list(genflat(L, list))  # Alex Martelli - https://stackoverflow.com/a/2159079/5393381
    23.1 µs ± 710 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    我是 迭代工具 图书馆。

        10
  •  6
  •   Noctis Skytower    10 年前

    尝试创建一个可以在python中平展不规则列表的函数是很有趣的,当然这就是python的目的(使编程变得有趣)。以下发电机工作正常,但有一些注意事项:

    def flatten(iterable):
        try:
            for item in iterable:
                yield from flatten(item)
        except TypeError:
            yield iterable
    

    它将扁平化您可能希望单独使用的数据类型(如 bytearray , bytes str 对象)。此外,代码依赖这样一个事实:从非iterable请求迭代器会引发 TypeError .

    >>> L = [[[1, 2, 3], [4, 5]], 6]
    >>> def flatten(iterable):
        try:
            for item in iterable:
                yield from flatten(item)
        except TypeError:
            yield iterable
    
    
    >>> list(flatten(L))
    [1, 2, 3, 4, 5, 6]
    >>>
    

    编辑:

    我不同意以前的实现。问题是,你不应该压扁那些不可迭代的东西。这很混乱,给人的印象是错误的。

    >>> list(flatten(123))
    [123]
    >>>
    

    下面的生成器几乎与第一个生成器相同,但不存在试图展平不可迭代对象的问题。当给它一个不适当的论据时,它会如人们所期望的那样失败。

    def flatten(iterable):
        for item in iterable:
            try:
                yield from flatten(item)
            except TypeError:
                yield item
    

    使用提供的列表测试发电机工作正常。但是,新代码将引发 类型错误 当给它一个不可重写的对象时。新行为的示例如下所示。

    >>> L = [[[1, 2, 3], [4, 5]], 6]
    >>> list(flatten(L))
    [1, 2, 3, 4, 5, 6]
    >>> list(flatten(123))
    Traceback (most recent call last):
      File "<pyshell#32>", line 1, in <module>
        list(flatten(123))
      File "<pyshell#27>", line 2, in flatten
        for item in iterable:
    TypeError: 'int' object is not iterable
    >>>
    
        11
  •  4
  •   clay    14 年前

    我喜欢简单的答案。没有发电机。没有递归或递归限制。只是迭代:

    def flatten(TheList):
        listIsNested = True
    
        while listIsNested:                 #outer loop
            keepChecking = False
            Temp = []
    
            for element in TheList:         #inner loop
                if isinstance(element,list):
                    Temp.extend(element)
                    keepChecking = True
                else:
                    Temp.append(element)
    
            listIsNested = keepChecking     #determine if outer loop exits
            TheList = Temp[:]
    
        return TheList
    

    这适用于两个列表:内部for循环和外部while循环。

    内部for循环遍历列表。如果它找到一个list元素,它(1)使用list.extend()将该部分扁平化一级嵌套,(2)将keepchecking切换为true。keepchecking用于控制外部while循环。如果外部循环设置为true,则会触发内部循环以进行另一次传递。

    这些过程会一直发生,直到找不到更多的嵌套列表。当一个过程最终在没有找到的地方发生时,keepchecking永远不会被触发为true,这意味着listinsested保持为false,而outer则退出循环。

    然后返回扁平列表。

    试运行

    flatten([1,2,3,4,[100,200,300,[1000,2000,3000]]])
    

    [1, 2, 3, 4, 100, 200, 300, 1000, 2000, 3000]

        12
  •  4
  •   Xolve    14 年前

    虽然我们选择了一个优雅的、非常有感染力的答案,但我还是会提出我的解决方案供大家参考:

    def flat(l):
        ret = []
        for i in l:
            if isinstance(i, list) or isinstance(i, tuple):
                ret.extend(flat(i))
            else:
                ret.append(i)
        return ret
    

    请说明此代码有多好或有多坏?

        13
  •  4
  •   Wilfred Hughes AntuanSoft    11 年前

    下面是一个简单的函数,它可以扁平任意深度的列表。没有递归,以避免堆栈溢出。

    from copy import deepcopy
    
    def flatten_list(nested_list):
        """Flatten an arbitrarily nested list, without recursion (to avoid
        stack overflows). Returns a new list, the original list is unchanged.
    
        >> list(flatten_list([1, 2, 3, [4], [], [[[[[[[[[5]]]]]]]]]]))
        [1, 2, 3, 4, 5]
        >> list(flatten_list([[1, 2], 3]))
        [1, 2, 3]
    
        """
        nested_list = deepcopy(nested_list)
    
        while nested_list:
            sublist = nested_list.pop(0)
    
            if isinstance(sublist, list):
                nested_list = sublist + nested_list
            else:
                yield sublist
    
        14
  •  2
  •   pradyunsg ThisIsAQuestion    11 年前

    这里是 compiler.ast.flatten 2.7.5中的实施:

    def flatten(seq):
        l = []
        for elt in seq:
            t = type(elt)
            if t is tuple or t is list:
                for elt2 in flatten(elt):
                    l.append(elt2)
            else:
                l.append(elt)
        return l
    

    有更好、更快的方法(如果你已经到达这里,你已经看到了)

    还要注意:

    自2.6版以来已弃用:已在python 3中删除编译器包。

        15
  •  2
  •   Zion    9 年前

    我很惊讶没人想到这一点。该死的递归,我不知道这里的高级人员给出的递归答案。不管怎样,这是我的尝试。需要注意的是,它非常特定于OP的用例

    import re
    
    L = [[[1, 2, 3], [4, 5]], 6]
    flattened_list = re.sub("[\[\]]", "", str(L)).replace(" ", "").split(",")
    new_list = list(map(int, flattened_list))
    print(new_list)
    

    输出:

    [1, 2, 3, 4, 5, 6]
    
        16
  •  2
  •   Shreyas    8 年前

    我并没有把所有已经有的答案都写在这里,但这里有一个我想出的一行程序,借用了Lisp的第一和剩余列表处理方法。

    def flatten(l): return flatten(l[0]) + (flatten(l[1:]) if len(l) > 1 else []) if type(l) is list else [l]
    

    这里有一个简单的和一个不那么简单的例子-

    >>> flatten([1,[2,3],4])
    [1, 2, 3, 4]
    
    >>> flatten([1, [2, 3], 4, [5, [6, {'name': 'some_name', 'age':30}, 7]], [8, 9, [10, [11, [12, [13, {'some', 'set'}, 14, [15, 'some_string'], 16], 17, 18], 19], 20], 21, 22, [23, 24], 25], 26, 27, 28, 29, 30])
    [1, 2, 3, 4, 5, 6, {'age': 30, 'name': 'some_name'}, 7, 8, 9, 10, 11, 12, 13, set(['set', 'some']), 14, 15, 'some_string', 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
    >>> 
    
        17
  •  1
  •   Joran Beasley    10 年前

    完全是黑客,但我认为它会起作用(取决于你的数据类型)

    flat_list = ast.literal_eval("[%s]"%re.sub("[\[\]]","",str(the_list)))
    
        18
  •  1
  •   Samy Vilar    10 年前

    这是另一个PY2方法,我不确定它是最快的,还是最优雅的,还是最安全的…

    from collections import Iterable
    from itertools import imap, repeat, chain
    
    
    def flat(seqs, ignore=(int, long, float, basestring)):
        return repeat(seqs, 1) if any(imap(isinstance, repeat(seqs), ignore)) or not isinstance(seqs, Iterable) else chain.from_iterable(imap(flat, seqs))
    

    它可以忽略您想要的任何特定(或派生)类型,它返回一个迭代器,因此您可以将它转换为任何特定的容器,如list、tuple、dict或简单地使用它来减少内存占用,无论是好是坏,它都可以处理初始的不可重复对象,如int…

    注意,大部分繁重的工作都是在C中完成的,因为据我所知,ITertools是如何实现的,所以虽然它是递归的,但是afaik它不受python递归深度的限制,因为函数调用是在C中进行的,尽管这并不意味着您受到内存的限制,特别是在OS X中,到今天为止它的堆栈大小有一个硬限制(OSX小牛队……

    有一个稍微快一点的方法,但是不太可移植的方法,只有当你可以假设输入的基本元素可以显式地确定,否则,你将得到一个无限的递归,并且OSX的堆栈大小有限,会很快抛出一个分段错误…

    def flat(seqs, ignore={int, long, float, str, unicode}):
        return repeat(seqs, 1) if type(seqs) in ignore or not isinstance(seqs, Iterable) else chain.from_iterable(imap(flat, seqs))
    

    这里我们使用集合来检查类型,因此需要O(1)和O(类型数)来检查元素是否应该被忽略,尽管具有所述被忽略类型的派生类型的任何值都将失败,这就是为什么它使用 str , unicode 所以小心使用它…

    测验:

    import random
    
    def test_flat(test_size=2000):
        def increase_depth(value, depth=1):
            for func in xrange(depth):
                value = repeat(value, 1)
            return value
    
        def random_sub_chaining(nested_values):
            for values in nested_values:
                yield chain((values,), chain.from_iterable(imap(next, repeat(nested_values, random.randint(1, 10)))))
    
        expected_values = zip(xrange(test_size), imap(str, xrange(test_size)))
        nested_values = random_sub_chaining((increase_depth(value, depth) for depth, value in enumerate(expected_values)))
        assert not any(imap(cmp, chain.from_iterable(expected_values), flat(chain(((),), nested_values, ((),)))))
    
    >>> test_flat()
    >>> list(flat([[[1, 2, 3], [4, 5]], 6]))
    [1, 2, 3, 4, 5, 6]
    >>>  
    
    $ uname -a
    Darwin Samys-MacBook-Pro.local 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun  3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64
    $ python --version
    Python 2.7.5
    
        19
  •  1
  •   Saksham Varma    9 年前

    使用 itertools.chain :

    import itertools
    from collections import Iterable
    
    def list_flatten(lst):
        flat_lst = []
        for item in itertools.chain(lst):
            if isinstance(item, Iterable):
                item = list_flatten(item)
                flat_lst.extend(item)
            else:
                flat_lst.append(item)
        return flat_lst
    

    或者没有链子:

    def flatten(q, final):
        if not q:
            return
        if isinstance(q, list):
            if not isinstance(q[0], list):
                final.append(q[0])
            else:
                flatten(q[0], final)
            flatten(q[1:], final)
        else:
            final.append(q)
    
        20
  •  1
  •   Alex Lisovoy    9 年前

    我用递归法求解 任何深度的嵌套列表

    def combine_nlist(nlist,init=0,combiner=lambda x,y: x+y):
        '''
        apply function: combiner to a nested list element by element(treated as flatten list)
        '''
        current_value=init
        for each_item in nlist:
            if isinstance(each_item,list):
                current_value =combine_nlist(each_item,current_value,combiner)
            else:
                current_value = combiner(current_value,each_item)
        return current_value
    

    所以在我定义了函数组合列表之后,很容易使用这个函数来做扁平化。或者你可以把它组合成一个函数。我喜欢我的解决方案,因为它可以应用于任何嵌套列表。

    def flatten_nlist(nlist):
        return combine_nlist(nlist,[],lambda x,y:x+[y])
    

    结果

    In [379]: flatten_nlist([1,2,3,[4,5],[6],[[[7],8],9],10])
    Out[379]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
        21
  •  1
  •   YPCrumble    9 年前

    最简单的方法是使用 morph 图书馆利用 pip install morph .

    代码是:

    import morph
    
    list = [[[1, 2, 3], [4, 5]], 6]
    flattened_list = morph.flatten(list)  # returns [1, 2, 3, 4, 5, 6]
    
        22
  •  1
  •   Leo wahyd    8 年前

    我知道已经有很多很棒的答案,但我想添加一个使用函数编程方法来解决问题的答案。在这个答案中,我使用了双递归:

    def flatten_list(seq):
        if not seq:
            return []
        elif isinstance(seq[0],list):
            return (flatten_list(seq[0])+flatten_list(seq[1:]))
        else:
            return [seq[0]]+flatten_list(seq[1:])
    
    print(flatten_list([1,2,[3,[4],5],[6,7]]))
    

    输出:

    [1, 2, 3, 4, 5, 6, 7]
    
        23
  •  1
  •   diligar    7 年前

    我不确定这是否需要更快或更有效,但这是我要做的:

    def flatten(lst):
        return eval('[' + str(lst).replace('[', '').replace(']', '') + ']')
    
    L = [[[1, 2, 3], [4, 5]], 6]
    print(flatten(L))
    

    这个 flatten 函数在这里将列表转换为字符串,然后 全部的 在方括号中,将方括号重新连接到两端,并将其转回到列表中。

    但是,如果你知道你的列表中会有方括号,比如 [[1, 2], "[3, 4] and [5]"] 你得做点别的。

        24
  •  0
  •   inspectorG4dget Dillon Benson    15 年前

    如果您喜欢递归,这可能是您感兴趣的解决方案:

    def f(E):
        if E==[]: 
            return []
        elif type(E) != list: 
            return [E]
        else:
            a = f(E[0])
            b = f(E[1:])
            a.extend(b)
            return a
    

    实际上,我改编了一些之前编写的实践方案代码。

    享受!

        25
  •  0
  •   Michael Puckett    14 年前

    我对python不熟悉,来自Lisp背景。这就是我想到的(查看lulz的var名称):

    def flatten(lst):
        if lst:
            car,*cdr=lst
            if isinstance(car,(list,tuple)):
                if cdr: return flatten(car) + flatten(cdr)
                return flatten(car)
            if cdr: return [car] + flatten(cdr)
            return [car]
    

    似乎起作用了。测试:

    flatten((1,2,3,(4,5,6,(7,8,(((1,2)))))))
    

    返回:

    [1, 2, 3, 4, 5, 6, 7, 8, 1, 2]
    
        26
  •  0
  •   Abhijit    11 年前

    我在这里没有看到像这样的东西,只是从一个关于同一主题的封闭式问题中得到的,但是为什么不做这样的事情(如果你知道你想要分割的列表的类型):

    >>> a = [1, 2, 3, 5, 10, [1, 25, 11, [1, 0]]]    
    >>> g = str(a).replace('[', '').replace(']', '')    
    >>> b = [int(x) for x in g.split(',') if x.strip()]
    

    你需要知道元素的类型,但我认为这可以概括,就速度而言,我认为它会更快。

        27
  •  0
  •   Nir Alfasi    10 年前

    不使用任何库:

    def flat(l):
        def _flat(l, r):    
            if type(l) is not list:
                r.append(l)
            else:
                for i in l:
                    r = r + flat(i)
            return r
        return _flat(l, [])
    
    
    
    # example
    test = [[1], [[2]], [3], [['a','b','c'] , [['z','x','y']], ['d','f','g']], 4]    
    print flat(test) # prints [1, 2, 3, 'a', 'b', 'c', 'z', 'x', 'y', 'd', 'f', 'g', 4]
    
        28
  •  0
  •   Community CDub    7 年前

    不知羞耻地从我自己的回答中 another question .

    这个函数

    • 不使用 isinstance 因为它是邪恶的,破坏了鸭子的打字。
    • 使用 reduce 递归地。必须有一个答案 减少 .
    • 使用任意嵌套列表,其元素要么是嵌套列表,要么是非嵌套原子列表,要么是原子(受递归限制)。
    • 不是LBYL。
    • 但不能使用嵌套列表,该列表包含作为原子的字符串。

    代码如下:

    def flattener(left, right):
        try:
            res = reduce(flattener, right, left)
        except TypeError:
            left.append(right)
            res = left
        return res
    
    
    def flatten(seq):
        return reduce(flattener, seq, [])
    
    
    >>> nested_list = [0, [1], [[[[2]]]],
                       [3, [], [4, 5]],
                       [6, [7, 8],
                        9, [[[]], 10,
                            []]],
                       11, [], [],
                       [12]]
    >>> flatten(nested_list)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    
        29
  •  0
  •   noobcoder    9 年前

    我们还可以使用python的“type”函数。在迭代列表时,我们检查该项是否是列表。如果没有,我们就“附加”它,否则我们就“扩展”它。这是一个示例代码-

    l=[1,2,[3,4],5,[6,7,8]]
    x=[]
    for i in l:
        if type(i) is list:
            x.extend(i)
        else:
            x.append(i)
    print x
    

    输出:

    [1, 2, 3, 4, 5, 6, 7, 8]
    

    有关append()和extend()的详细信息,请访问以下网站: https://docs.python.org/2/tutorial/datastructures.html

        30
  •  0
  •   halcyonjuly7    8 年前

    这可能是个老问题,我想试试看。

    我是个哑巴,所以我会给出一个“哑巴”的解决方案。所有的递归都会伤害我的大脑。

    flattened_list  = []
    nested_list =[[[1, 2, 3], [4, 5]], 6]
    
    def flatten(nested_list, container):
        for item in nested_list:
            if isintance(item, list):
                flatten(item)
            else:
                container.append(i)
    
    >>> flatten(nested_list, flattened_list)
    >>> flattened_list
    [1, 2, 3, 4, 5, 6]
    

    我知道它在使用副作用,但我对递归的理解是这样的