0

我试图从 json 响应结果生成类似倒排索引的结构。

[{“节点”:[{“节点”:[{“节点”:[{“id”:“w”}],“id”:“q”}],“id”:“e”},{ "id":"r"},{"id":"t"}],"id":"y"}, {"id":"u"}]

这是示例 json 数据,我正在尝试跟踪每个“id”对象的索引。例如,在给定的示例中,“id”等于“u”的对象具有索引 [1],而“id”等于“q”的对象具有索引 [0[0[0]]]。

此处的结果索引表示形式为数组形式,因此分别为 [1] 和 [0,0,0]。

我已经为这一切编写了这段代码。

class Tree:

    def __init__(self, data):
        self.data = data
        self.indices = {}

        self.create_index(self.data)

    def create_index(self, data):
        for i in range(len(data)):
            self.trace_node(data[i], i, [])

        print self.indices

    def trace_node(self, node, index, index_list):
        _list = index_list
        _list.append(index)

        self.indices[node['id']] = _list
        print node['id'], _list

        try:
            for i in range(len(node['node'])):
                self.trace_node(node['node'][i], i, _list)
        except:
            pass

当我运行此代码时,它会在跟踪时为每个节点打印正确的结果,但在执行结束时,索引类变量(dict object)留下了奇怪的值,我无法弄清楚,为什么?

这是执行的结果,我使用了上面给出的 json数据

树 = 树(数据)

它打印出这个:

是 [0]

e [0, 0]

q [0, 0, 0]

w [0, 0, 0, 0]

r [0, 1]

t [0, 2]

你 [1]

{'e':[0],'q':[0],'r':[0],'u':[1],'t':[0],'w':[0],' y':[0]}

所以你可以在这里看到它为每个'id'打印正确的结果索引数组,但最后类变量索引只是显示,不知道是什么。

PS:其实我不相信问这种个人问题,但我整天都在与这个作斗争。我也问过我的朋友,经过一段时间的争吵,他也说我觉得一切都很好。

所以我正在等待答案和从中吸取教训:)

提前致谢。

4

1 回答 1

0

正如评论部分所指出的,您需要复制列表。

只需更换

self.indices[node['id']] = _list

self.indices[node['id']] = _list[:]

您看到奇怪结果的原因是,同一主树分支的所有节点都获得了_list分配给它们的相同对象。既然你在做_list.pop(),最终_list就变成了顶级索引的列表。

此外,node['ch']应该node['node']在你的代码片段中。我想这只是一个打字错误:-)

于 2014-10-12T07:37:32.387 回答