在Python中,递归方法的属性错误

2024-09-26 22:13:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于python的递归方法问题,代码如下:

class NodeTree(object):
    def __init__(self, name, children):
        self.name = name
        self.children = children

    def count(self):
        # 1 + i children's nodes
        count = 1
        for c in self.children:
            count += c.count()
        return count


def create_tree(d):
    N = NodeTree(d['name'], d['children'])
    print N.count()

d1 = {'name':'musica', 'children':[{'name':'rock', 'children':[{'name':'origini','children':[]},
                                                               {'name':'rock&roll','children':[]},
                                                               {'name':'hard rock', 'children':[]}]},
                                   {'name':'jazz', 'children':[{'name':'origini', 'children':[{'name':'1900', 'children':[]}]},
                                                               {'name':'ragtime', 'children':[]}, {'name':'swing', 'children':[]}]}]}
tree = create_tree(d1)

错误是:

^{pr2}$

我什么都试过了,但没用。在

不管怎样,有什么建议吗? 谢谢!在


Tags: 方法代码nameselftreeobjectdefcount
3条回答

d['children']是一个list of dict,如您在d1dict中所见

现在,当你在你的children上迭代时,在NodeTree中,本质上只有d['children'],你将得到{}作为每个元素:

for c in self.children:  // c is a `dict` type here
    count += c.count()   // there is not attribute as `count` for a `dict`.

所以你得到了那个错误。在

好吧,有一次,create_tree函数不会递归地构建树。所以只需在零级上添加一个节点,子节点就是字典。在

下面的(修改过的)代码(虽然类型很快而且很草率)应该执行递归 树的构造。没有检查您的count代码,但假设它是正确的,它应该可以工作。在

class NodeTree(object):
    def __init__(self, name, children):
        self.name = name
        self.children = children

    def count(self):
        # 1 + i children's nodes
        count = 1
        for c in self.children:
            count += c.count()
        return count


def deep_create_tree(d):
    if len(d["children"]) > 0:
        chlds = []
        for i in d["children"]:
            chlds.append(deep_create_tree(i))
    else:
        chlds = []
    n = NodeTree(d["name"], chlds)
    return n


d1 = {'name':'musica', 'children':[{'name':'rock', 'children':[{'name':'origini','children':[]},{'name':'rock&roll','children':[]},{'name':'hard rock', 'children':[]}]},{'name':'jazz', 'children':[{'name':'origini', 'children':[{'name':'1900', 'children':[]}]},{'name':'ragtime', 'children':[]}, {'name':'swing', 'children':[]}]}]}

def scan_tree(tr):
    print tr.name, tr.count()
    for i in tr.children:
        scan_tree(i)

tr = deep_create_tree(d1)
scan_tree(tr)

这是因为Python字典没有count方法。在

如果我们逐行检查你的代码实际在做什么,这会有帮助。在

    def count(self):
        # 1 + i children's nodes
        count = 1
        for c in self.children:      ## self.children is a list of dictionaries, so each c is a dictionary
            count += c.count()       ## We are getting .count() of c--which is a dictionary
        return count

这是因为我们通过了d1【‘children’】自己的孩子,这是一个字典列表:[<dict>, <dict>, <dict>, ... ]。在

而不是count(),你应该做的是调用字典上的len,以获得它拥有的键数,从而变成:

^{pr2}$

相关问题 更多 >

    热门问题