[英]Python recursion in appending lists
我想遞歸地將 append 添加到列表中,但我想不出一個有效的 function。 function 需要兩個 arguments times
和data
。 times
應該是數據到append的次數。
到目前為止,這是我的代碼:
def replicate_recur(times, data):
result2 = []
if times == 0:
result2.append(data)
else:
result2.append(data)
replicate_recur(times - 1, data)
return result2
您可以在每個遞歸調用中使用中間列表來追加。 這樣可以避免您當前遇到的這些重新定義問題:
def replicate_recur(times, data, result=None):
if result is None: # create a new result if no intermediate was given
result = []
if times == 1:
result.append(data)
else:
result.append(data)
replicate_recur(times - 1, data, result) # also pass in the "result"
return result
調用時:
>>> replicate_recur(4, 2)
[2, 2, 2, 2]
為了使代碼正常工作,您需要使用下一個遞歸調用的輸出來extend
當前執行中的列表。 同樣,遞歸的最低深度應由times = 1
定義:
def replicate_recur(times, data):
result2 = []
if times == 1:
result2.append(data)
else:
result2.append(data)
result2.extend(replicate_recur(times - 1, data))
return result2
另外,您可以使用以下方法簡單地復制列表:
def replicate(times, data):
return [data]*times
您可以為此使用xrange
,除非是編碼測試,否則沒有必要使用遞歸。
def replicate(times, data):
result2 = []
for i in xrange(times):
result2.append(data)
return result2
可以以遞歸方式編寫相同的函數,如下所示:
def replicate_recur(times, data, listTest=None):
# If a list has not been passed as argument create an empty one
if(listTest == None):
listTest = []
# Return the list if we need to replicate 0 more times
if times == 0:
return listTest
# If we reach here at least we have to replicate once
listTest.append(data)
# Recursive call to replicate more times, if needed and return the result
replicate_recur(times-1, data, listTest)
return listTest
因為您每次都重新定義result2。 將result2保留在函數之外,它應該可以工作。
你也可以考慮做數據*時間來復制,如果數據是一個列表或只是做
(result2.append(data))*times
在遞歸中,每次調用copy_recur時,都會在新名稱空間中創建一個新的result2。
[data] * times
會做您想要達到的目標。
Python 使用“傳遞對象引用”,這就是為什么以下代碼中的任何一個都可以解決您的問題。
def replicate_recur(times, data, result2 = []):
if times == 1:
result2.append(data)
else:
result2.append(data)
replicate_recur(times - 1, data)
return result2
調用時:
>>> replicate_recur(4, 2)
[2, 2, 2, 2]
或者,您可以創建 result2 列表並將其作為參數傳遞給 function。該參數是“由 Object 引用傳遞”,因此在 function 內部也修改了相同的結果 object。
def replicate_recur(times, data):
if times == 1:
result2.append(data)
else:
result2.append(data)
replicate_recur(times - 1, data)
return result2
調用時:
>>> result2 = []
>>> replicate_recur(4, 2)
[2, 2, 2, 2]
請參閱以下鏈接以了解更多有關通過 Object 參考的信息。 Python:經過Object參考
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.