2012-03-15 77 views
3

我有一個結構,列表中有x個列表,每個列表中有x個元組。事先並不知道有多少嵌套列表,或每個列表中有多少個元組。如何在不停止遞歸的情況下在遞歸函數中返回值?

我想從所有的元組中製作字典,因爲我不知道我想使用遞歸的列表的深度。我做的是

def tupleToDict(listOfList, dictList): 
    itemDict = getItems(list) # a function that makes a dictionary out of all the tuples in list 
    dictList.append(itemDict) 
    for nestedList in listOfList: 
     getAllNestedItems(nestedList, dictList) 

    return dictList 

這個工程,但我最後得到一個巨大的名單。我寧願在每次遞歸時都返回itemDict。但是,我不知道如何(如果可能的話)在不停止遞歸的情況下返回一個值。

+2

如果你有一個元組列表,你可以通過簡單地使用'字典(L)創建一個字典'就可以了... – hochl 2012-03-15 11:13:01

回答

6

您正在尋找yield

def tupleToDict(listOfList): 
    yield getItems(listofList) 
    for nestedList in listOfList: 
     for el in getAllNestedItems(nestedList): 
      yield el 

在Python 3.3+,您可以用yield from取代的最後兩行。

您可能要重寫你的函數是迭代:

def tupleToDict(listOfList): 
    q = [listOfList] 
    while q: 
     l = q.pop() 
     yield getItems(l) 
     for nestedList in listOfList: 
      q += getAllNestedItems(nestedList) 
+0

令人敬畏的使用產量!謝謝! – 2012-03-15 11:29:16

+0

由於缺乏可迭代的對象,可能存在生成器模式不足的用例。想到近似,邊界條件或一些分形算法。生成器可以即時創建迭代器,但如果不需要迭代,則可能需要尋找其他方法或重構原始解決方案以匹配生成器模式。 - 只是一個網站注意要記住! ;-) – 2012-03-15 11:45:51

1

你打算把它歸還給誰?我的意思是如果你的線程忙於運行遞歸算法,誰得到「臨時結果」來處理?

最好的辦法是調整你的算法,使其包含一些處理,然後再次遞歸。

1

我不知道你想做什麼,但你可以嘗試使用yield語句來進行遞歸發生器按照期望的時間間隔返回字典。或者將其複製到全局列表中?

1

你有兩個可能的解決方案:

  1. 發電機的辦法:用yield語句的功能,這可能是一個麻煩,以在遞歸函數實現。 (以phihags建議爲例)

  2. 回調方法:您可以從遞歸內部調用輔助函數/方法,並可以通過第二個外部函數監視進度。

這裏非遞歸遞歸例如:;-)

def callback(data): print "from the depths of recursion: {0}".format(data)

def recursion(arg, callbackfunc): 
    arg += 1 
    callbackfunc(arg) 
    if arg <10: 
     recursion(arg, callbackfunc) 
    return arg 

print recursion(1, callback)