需要打开此示例列表
list = ["Hello","world","!!!"]
进入这样的嵌套列表
new_list = ["Hello",["world",["!!!",None]]]
对于给定的任何平面列表。我可以用某种方式从嵌套列表中做出一个平面列表,但是经过数小时的尝试,我似乎找不到自己或谷歌搜索的解决方案。我已经在这里搜索过,但是没有发现任何具体问题。
在此先感谢您,如果这是一个愚蠢的问题,我们将对此表示歉意。
答案 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)
运行正常。