2

全部,

我有一本 Python 中的字典列表字典。这代表了一种父子关系。给定一个孩子,我想还给父母。

这是我的收藏:

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

如您所见,“一”有孩子“二”和“五”,“二”有孩子“三”和“四”,“三”没有孩子,依此类推。

以下代码正确计算出给定孩子的父母:

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,它的值总是“无”。这里一定有什么东西超出了范围。我只是不知道如何解决它。

谢谢。

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 回答