2013-04-28 21 views
2

我有以下代碼遞歸調用internal_dep中的每個值,有沒有一種方法可以更改函數調用以僅調用鍵存在於internal_dep中或跳過跳過列表中的那些調用?遞歸調用僅用於internal_dep中存在的鍵值或跳過跳過列表中存在的鍵

internal_dep = {'313115': ['313113'], '313117': ['313115'], '313137': ['313136'], '313136': ['313119'], '313119': ['313118'], '313118': ['313117']} 
mainlist = ['313137', '317152' , '314449'] 
skip = ['313113'] 

def _getdep(item): 
    local_list, temp_list = [], [] 
    temp_list.extend(internal_dep[item]) 
    local_list.extend(temp_list) 
    for new_item in temp_list: 
     local_list.extend(_getdep(new_item)) 
    return local_list 

build_dep_list = [] 
for item in mainlist: 
    build_dep_list.append(item) 
    build_dep_list.extend(_getdep(item)) 

print build_dep_list 

錯誤: -

Traceback (most recent call last): 
    File "test.py", line 16, in <module> 
    build_dep_list.extend(_getdep(item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 10, in _getdep 
    local_list.extend(_getdep(new_item)) 
    File "test.py", line 6, in _getdep 
    temp_list.extend(internal_dep[item]) 
KeyError: '313113' 

EXPECTED OUTPUT:- 
['313115', '313113', '313117','313137','313136','313119','313118','313117'] 
+0

你的意思是隻調用'mainlist'中的那些跳過'skip'列表中的鍵? – 2013-04-28 09:19:35

+0

@AshwiniChaudhary - 是的,調用mainlist及其依賴項中的那些,只有internal_dep – user2125827 2013-04-28 09:48:34

+0

中提到的鍵請參閱我編輯的解決方案。 – 2013-04-28 10:12:44

回答

3

我會修改_getdep功能是這樣的:

def _getdep(item): 
    final_dep = [] 
    dep = internal_dep.get(item, []) 
    final_dep.extend(internal_dep.get(item, [])) 
    for i in [d for d in dep if d not in skip]: 
     final_dep.extend(_getdep(i)) 
    return final_dep 

對於使用internal_dep.get(項目,[])看到: http://docs.python.org/3/library/stdtypes.html#dict.get(它返回internal_dep [item]的值或者如果沒有這樣的鍵爲空列表)
輸出:

['313137', '313136', '313119', '313118', '313117', '313115', '313113', '317152', '314449'] 
+0

- 感謝您的輸入..但我的輸出是正確的,在您的輸出中「313113」缺失..仍需要打印... – user2125827 2013-04-28 10:31:48

+0

謝謝,我修改它。在你的問題中,你使用'build_dep_list.append(item)'。然後'317152'和'314449'必須在輸出中。 – TobiMarg 2013-04-28 10:42:52

+0

你是對的那部分,但你的輸出是缺失的「313113」 – user2125827 2013-04-28 10:44:59