这可能不是最有效的方法,但我想放一个单线(实际上是两线)。这两个版本都适用于任意层次的嵌套列表,并利用语言特性(Python3.5)和递归。
def make_list_flat (l):
flist = []
flist.extend ([l]) if (type (l) is not list) else [flist.extend (make_list_flat (e)) for e in l]
return flist
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = make_list_flat(a)
print (flist)
输出是
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
这以深度优先的方式工作。递归下去,直到找到一个非列表元素,然后扩展局部变量flist
,然后将其回滚到父级。无论何时flist
返回,它都会扩展到flist
列表理解中的父级。因此,在根处,返回一个平面列表。
上面的创建了几个本地列表并返回它们用于扩展父列表。我认为解决这个问题的方法可能是创建一个 gloabl flist
,如下所示。
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = []
def make_list_flat (l):
flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l]
make_list_flat(a)
print (flist)
输出又是
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
虽然我目前不确定效率。