?來自這個Edabit挑戰?
我需要獲取嵌套串列的所有元素,并使用遞回將它們全部放在一個串列中。
我下面的代碼列印出每個元素,但是如何將它們全部保存到一個串列中并回傳它們?
它必須保持在函式的范圍內。我無法添加全域串列并附加所有串列。它在技術上有效,但不適用于我試圖通過的挑戰。
我列印了這些值(代碼中的 var x ),因為這表明我正在接近(我認為)。我只需要一種將值回傳給我的函式并將其附加到我最終將回傳的串列的方法。
例子:
flatten([[[[[["direction"], [372], ["one"], [[[[[["Era"]]]], "Sruth", 3337]]], "First"]]]]) ? ["direction", 372, "one", "Era", "Sruth", 3337, "First"]
flatten([[4666], [5394], [466], [[["Saskia", [[[[["DXTD"]], "Lexi"]]]]]]]) ? [4666, 5394, 466, "Saskia", "DXTD", "Lexi"]
代碼:
def 展平(arr):
水庫= []
如果是實體(arr,串列):
對于 arr 中的 i:
res.append(展平(i))
別的:
回傳 arr
如果是實體(資源,串列):
對于我在 res 中:
x = 展平(i)
如果 x:
列印(x)
x = flatten([[[[[["direction"], [372], ["one"], [[[[[[["Era"]]]], "Sruth", 3337]]], "First "]]]])
列印(主要)
輸出:
方向
372
一
時代
斯魯特
3337
第一的
[]
上面的輸出顯示我的代碼遍歷了每個非串列值。
uj5u.com熱心網友回復:
我想提供兩個解決方案:第一個使用遞回,第二個使用佇列。
第一個解決方案
def flatten_helper(nested):
for e in nested:
if isinstance(e, list):
yield from flatten_helper(e)
else:
yield e
def flatten(nested):
return list(flatten_helper(nested))
該flatten_helper函式是一個生成器,它生成一個不是串列的元素串列。如果一個元素是一個串列,我們flatten_helper會再次呼叫,直到我們得到非串列元素。
第二種解決方案
import collections
def flatten(nested):
queue = collections.deque(nested)
out = []
while queue:
e = queue.popleft()
if isinstance(e, list):
queue.extendleft(reversed(e))
else:
out.append(e)
return out
在這個解決方案中,我們回圈遍歷嵌套串列。如果元素是一個串列,我們將每個子元素放入一個佇列中以供以后處理。如果元素不是串列,我們將其附加到out.
uj5u.com熱心網友回復:
傳遞一個串列以展平,并在每一步附加到它:
def flatten(arr, list_):
if isinstance(arr, list):
for i in arr:
flatten(i, list_)
else:
list_.append(arr)
test = [['a'], 'b']
output = []
flatten(test, output)
output
['a', 'b']
編輯:如果您想專門回傳串列,請使用
def flatten(arr, list_=None):
if list_ is None:
list_ = []
if isinstance(arr, list):
for i in arr:
flatten(i, list_)
else:
list_.append(arr)
return list_
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479548.html
