如何使嵌套列表脱离平面列表?

时间:2019-12-16 15:19:45

标签: python python-3.x list nested

需要打开此示例列表

list = ["Hello","world","!!!"]

进入这样的嵌套列表

new_list = ["Hello",["world",["!!!",None]]]

对于给定的任何平面列表。我可以用某种方式从嵌套列表中做出一个平面列表,但是经过数小时的尝试,我似乎找不到自己或谷歌搜索的解决方案。我已经在这里搜索过,但是没有发现任何具体问题。

在此先感谢您,如果这是一个愚蠢的问题,我们将对此表示歉意。

2 个答案:

答案 0 :(得分:5)

您可以使用递归:

l = ["Hello","world","!!!"]
def to_list(d):
  return None if not d else [d[0], to_list(d[1:])]

print(to_list(l))

输出:

['Hello', ['world', ['!!!', None]]]

答案 1 :(得分:4)

这是一个迭代的解决方案:

def to_nested(seq):
    result = [seq[-1], None]
    for item in reversed(seq[:-1]):
        result = [item, result]
    return result


l = ["Hello","world","!!!"]
print(to_nested(l))
# ['Hello', ['world', ['!!!', None]]]

基本上是从输入列表的末尾开始构造目标嵌套列表,并继续用由上一个元素及其早期自身组成的列表替换自身。


编辑

按时间顺序,这比@Ajax1234's answer中提出的递归方法更有效:

def to_nested_r(seq):
    return None if not seq else [seq[0], to_nested_r(seq[1:])]


%timeit to_nested(l * 100)
# 10000 loops, best of 3: 19.2 µs per loop
%timeit to_nested_r(l * 100)
# 10000 loops, best of 3: 167 µs per loop

另外,to_nested_r()可能会达到较大输入的最大递归限制:

to_nested_r(l * 1000)
  

RecursionError:超过最大递归深度

同时,to_nested()是一个迭代实现,不受递归限制和以下限制:

to_nested(l * 1000)

运行正常。