[英]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.