簡體   English   中英

如何從平面列表中制作嵌套列表?

[英]How to make nested lists out of flat list?

需要翻這個例子列表

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

進入這樣的嵌套列表

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

對於給定的任何類型的平面列表。 不知何故,我可以從嵌套列表中創建一個平面列表,但經過數小時的嘗試后,我似乎無法自己或通過谷歌搜索找到解決方案。 我在這里搜索過,但沒有發現這個特定問題。

提前致謝,如果這是一個愚蠢的問題,我很抱歉。

您可以使用遞歸:

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

這是一個迭代解決方案:

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 的回答中提出的遞歸方法更有效:

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)

運行得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM