2

全て、

私はPythonで辞書のリストの辞書を持っています。これは親子関係を表しています。子供を与えられたら、親を返したいと思います。

ここに私のコレクションがあります:

tree = { u'one' : [ { u'two' : [ { u'three' : [] }, { u'four' : [] } ] }, { u'five' : [ { u'six' : [] } ] } ] }

ご覧のとおり、"one" には子 "two" と "five" があり、"two" には子 "three" と "four" があり、"three" には子がありません。

次のコードは、特定の子の親を正しく処理します。

def find_parent(search_term,collection,parent=None):
  if isinstance(collection,dict):
    for key,value in collection.iteritems():
      if key.lower() == search_term.lower():
        print "the parent of %s is %s" % (key,parent)
        return parent
      if isinstance(value,list):
        for v in value:
          find_parent(search_term,v,key)

my_child = "two"
my_parent = find_parent(my_child,tree)

その関数の print ステートメントは、常に正しい値を出力します。しかし、my_parent にアクセスしようとすると、その値は常に "None" になります。ここで何かが範囲外になっているに違いありません。私はそれを修正する方法を理解できません。

ありがとう。

4

2 に答える 2

4

再帰呼び出しの値も返す必要があります。

if isinstance(value,list):
    for v in value:
        parent = find_parent(search_term,v,key)
        if parent is not None: return parent

無視せずreturnに、再帰検索の戻り値を破棄します。

return追加されたデモ:

>>> def find_parent(search_term,collection,parent=None):
...   if isinstance(collection,dict):
...     for key,value in collection.iteritems():
...       if key.lower() == search_term.lower():
...         print "the parent of %s is %s" % (key,parent)
...         return parent
...       if isinstance(value,list):
...         for v in value:
...           parent = find_parent(search_term,v,key)
...           if parent is not None: return parent
... 
>>> my_child = "two"
>>> tree = { u'one' : [ { u'two' : [ { u'three' : [] }, { u'four' : [] } ] }, { u'five' : [ { u'six' : [] } ] } ] }
>>> find_parent(my_child,tree)
the parent of two is one
u'one'
于 2013-06-24T23:36:14.743 に答える
3

再帰的に呼び出しますfind_parent(search_term,v,key)が、戻り値は無視します。優れた Python IDE を見つけて、そのデバッグ機能の使い方を学ぶことをお勧めします。これは、このような論理エラーを追跡するのに非常に役立ちます。

于 2013-06-24T23:34:52.663 に答える