2017-02-04 34 views
1

這是解決this問題時我的代碼中的一小段代碼。我想將列表中的項目推入堆棧,但傳遞給run函數時應將相同的項目名稱用作列表名稱。我的意圖是接近深度的第一搜索和基本情況來阻止遞歸即將被包括在我的代碼中。 有沒有辦法彈出cast項作爲列表名參數。將列表項名稱作爲列表類型傳遞給函數

#Below is dependency list 
p1-['p2','p3'] 
p2=['p3','p4'] 
p3=['p4'] 
p4=[] 
p5=[] 

def run(pro=[]) 
    if pro: #process has a dependency, push its items dependency into stack 
     for dependency in pro: 
      stack.push(dependency) 
     run(stack.peek) #I need to pass top item of stack as a list 
+3

不要使用單獨的變量,請使用將名稱映射到列表的字典。然後你可以在字典中查找依賴關係。 – Barmar

+1

請小心使用可變默認參數! http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+0

@Barmar即使我採取了一個字典,並推動每個列表項的關鍵,那麼我也該如何告訴python將stack.peek元素作爲字典的關鍵。 python相當新穎,請您詳細說明如何實現這一目標。謝謝 – user1977867

回答

2

下面是一個例子遞歸的,基於字典的方法:

dependencies = { \ 
    'p1': ['p2', 'p3'], \ 
    'p2': ['p3', 'p4'], \ 
    'p3': ['p4'], \ 
    'p4': [], \ 
    'p5': [] \ 
    } 

def run_order(process, order=None): 

    if order is None: 
     order = [] 

    precursors = dependencies[process] 

    if precursors: 
     for precursor in precursors: 
      run_order(precursor, order) 

     if process not in order: 
      order.append(process) # should really be insert after right-most precursor 

    elif process not in order: 
      order.insert(0, process) # no dependencies, start ASAP 

    return order 

print(run_order('p1')) 

版畫

['p4', 'p3', 'p2', 'p1'] 

這是否正確順序你的目的的過程? (您需要測試各種不同場景。)另一種方法是讓run_order()採取的進程列表:

def run_order(processes, order=None): 

    if order is None: 
     order = [] 

    for process in processes: 
     precursors = dependencies[process] 

     if precursors: 
      run_order(dependencies[process], order) 

      if process not in order: 
       order.append(process) # should really be insert after right-most precursor 

     elif process not in order: 
      order.insert(0, process) # no dependencies, start ASAP 

    return order 

print(run_order(['p1'])) 
print(run_order(list(dependencies.keys()))) 

版畫

['p4', 'p3', 'p2', 'p1'] 
['p5', 'p4', 'p3', 'p2', 'p1'] 

再次,測試各種不同場景來決定,如果它的工作原理爲你的目的。

+0

感謝這個例子,它似乎對我很好,我正在考慮如何處理重啓案例,例如,直到現在我們正在考慮啓動進程,重新啓動時,用'P5-> P1'給出,然後在重新啓動P1之後,我們還需要啓動P5,因爲它依賴於P1並且由於P1將被重新啓動,所以P5也應該重新啓動。 – user1977867

相關問題