1

第二个递归问题。我需要为递归函数中的值分配唯一 ID。

考虑一个文件夹结构,其中每个文件夹都可以包含项目或其他文件夹。但其中每一个都需要一个唯一的“id”。

我想,因为我不能在 python 的递归函数中使用任何全局变量,所以我会在每次调用时增加 id。但我大错特错了。想想下面的情况。

1 - 文件夹

2-文件夹

3 - 物品

4 - 物品

2 - 文件夹

由于递归的工作方式,id 被分配了两次,并且没有办法检查。我该怎么做呢?(我正在使用 python。每当我有一个变量 'uniqueid' 递增时,我都会收到错误消息:

赋值前引用的局部变量“uniqueid”

) 我的代码: make_link_item 只返回一个字符串。

def build_xml(node,depth,itemid):
    #if 'Children' in node:
        #print colleges
    depth += 1
    for child in node['Children']:
        itemid += 1
        print ("  " * (depth - 1)) + "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
        print ("  " * depth) + "<title>%s</title>" % child['Name'].encode('utf-8')
        build_xml(child,depth,itemid)
        print ("  " * (depth - 1)) + "</item>"
    lectures = getlectures(node['Id'])
    if lectures:
        build_lectures(lectures,itemid,itemid)

def build_lectures(lectures,itemid,parentid):
    for x in range(len(lectures)):
        itemid += 1
        if x % 2 == 0:
            print "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
            print "<title>" + lectures[x].encode('utf-8') + "</title>"
            print "</item>"
        else:
            make_link_item(lectures[x-1].encode('utf-8'),lectures[x].encode('utf-8'),itemid,parentid)

谢谢,

垫子

4

3 回答 3

1

我希望我不会错过这个问题。

您可以使用一个class Builder用于构建 xml 树状结构的对象。你的班级有一个成员increment,你每次遇到一个新项目时都会增加一个。这样,就没有两个相同的 ID。

class Builder:

   def __init__(self):
        self.increment = 0

   #other methods you need
于 2013-01-31T21:48:20.500 回答
0

使用集合中的 Counter() 类的帮助解决了这个问题。

出于某种明显的原因:

counter = Counter()

工作正常,我可以像这样增加它。

counter['id'] += 1

即使在我的递归循环中。我不知道为什么,但我认为这与引用传递和值传递有关。

于 2013-02-01T06:42:10.990 回答
0

您可以让每个 build_xml 调用返回其子项的最大标识符。然后您可以将下一个节点设置为该 id + 1。类似于:

def build_xml(node,depth,itemid):
    depth += 1
    for child in node['Children']:
        itemid += 1
        print ("  " * (depth - 1)) + "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
        print ("  " * depth) + "<title>%s</title>" % child['Name'].encode('utf-8')
        itemid = build_xml(child,depth,itemid)
        print ("  " * (depth - 1)) + "</item>"
    lectures = getlectures(node['Id'])
    if lectures:
        build_lectures(lectures,itemid,itemid)
    return itemid
于 2013-02-01T14:38:32.523 回答