我试图从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 :实际上我并不相信这种个人问题,但是我整整都在争吵。我问过我的朋友,经过一段时间的斗争后,他也说我的一切似乎都很好。
所以我在等待答案和教训从中学习:)
提前致谢。
答案 0 :(得分:0)
正如评论部分所指出的,您需要复制列表。
只需替换
self.indices[node['id']] = _list
与
self.indices[node['id']] = _list[:]
您看到奇怪结果的原因是,同一主树分支的所有节点都分配了相同的_list
对象。由于您正在执行_list.pop()
,因此最终_list
将成为顶级索引的列表。
此外,代码段中的node['ch']
应为node['node']
。我猜它只是打字错误: - )