【问题标题】:Python dictionary giving weird resultsPython字典给出奇怪的结果
【发布时间】:2014-10-12 06:24:59
【问题描述】:

我试图从 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

当我运行此代码时,它会在跟踪时为每个节点打印正确的结果,但在执行结束时,indices 类变量(dict object)被留下有奇怪的值,我就是想不通,为什么?

这里是执行的结果,我用上面给定的json data在这个。

树 = 树(数据)

然后打印出来:

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:其实我不相信问这种个人问题,但我整天都在和这个作斗争。我也问过我朋友,经过一段时间的争吵,他也说我觉得一切都很好。

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

提前致谢。

【问题讨论】:

  • 将列表分配给另一个变量并将列表作为参数传递,不要创建列表的副本。新变量将引用相同的列表。
  • 那我该怎么办?我应该使用 _list = list();_list = index_list 吗?我想 list() 将创建一个新的空列表。我说的对吗?
  • 给定一个列表,the_list 使用new_list = the_list[:] 将创建一个可以更改而不影响原始列表的列表副本。
  • 天哪!我怎么还是错过了这个。感谢 thefourtheye 和@lanAuld。它现在工作正常,我应该删除问题还是更新答案?
  • @pravj 一旦你找到了问题的根源(分配不傻),这个问题有很多重复;我建议删除它。否则,您应该将答案放在答案中,而不是问题中。

标签: python json class dictionary inverted-index


【解决方案1】:

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

只需替换

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多