Python字典给出了奇怪的结果

时间:2014-10-12 06:24:59

标签: python json class dictionary inverted-index

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

  

[{“node”:[{“node”:[{“node”:[{“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

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

以下是执行结果,我在上面给出了json 数据

  

tree =树(数据)

并打印出来:

y [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'打印了正确的结果索引数组,但最后类变量 indices 只是显示,不知道是什么。

  

PS :实际上我并不相信这种个人问题,但是我整整都在争吵。我问过我的朋友,经过一段时间的斗争后,他也说我的一切似乎都很好。

所以我在等待答案和教训从中学习:)

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

只需替换

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

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

您看到奇怪结果的原因是,同一主树分支的所有节点都分配了相同的_list对象。由于您正在执行_list.pop(),因此最终_list将成为顶级索引的列表。

此外,代码段中的node['ch']应为node['node']。我猜它只是打字错误: - )