2

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']
4

1 に答える 1

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(item, []) の使用については、http: //docs.python.org/3/library/stdtypes.html#dict.getを参照してください(internal_dep[item] の値を返すか、存在する場合そのようなキーは空のリストではありません)
出力:

['313137', '313136', '313119', '313118', '313117', '313115', '313113', '317152', '314449']
于 2013-04-28T09:52:40.467 に答える