【问题标题】:How to make nested lists out of flat list?如何从平面列表中制作嵌套列表?
【发布时间】:2019-12-16 15:19:45
【问题描述】:

需要翻一下这个例子列表

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

像这样进入嵌套列表

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

对于给定的任何类型的平面列表。不知何故,我可以从嵌套列表中制作一个平面列表,但经过数小时的尝试,我似乎无法自己或通过谷歌搜索找到解决方案。我在这里搜索过,但没有针对这个特定问题找到任何结果。

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

【问题讨论】:

  • 你为什么要这样做?
  • 也许他们喜欢 Lisp 并想实现 cons cells :-)

标签: python python-3.x list nested


【解决方案1】:

你可以使用递归:

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]]]

【讨论】:

    【解决方案2】:

    这是一个迭代解决方案:

    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)
    

    运行良好。

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2021-11-28
      • 2022-01-09
      相关资源
      最近更新 更多