2014-10-12 4 views
0

Я пытался создать структуру с инвертированным индексом из результата ответа json.Словарь Python, дающий странные результаты

[{"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

Когда я запускаю этот код, он печатает правильный результат для каждого узла, в то время как отслеживание, но в конце казни индексов переменного класса (ДИКТ объект) осталось с странными значениями, и я просто не могу понять, почему?

Вот результат выполнения, я использовал выше приведенный json данные в этом.

дерево = дерево (данные)

и печатает это:

у [0]

е [0, 0]

д [0, 0 , 0]

w [0, 0, 0, 0]

г [0, 1]

т [0, 2]

и [1]

{ 'е': [0], 'Q': [0], 'г' : [0], 'u': [1], 't': [0], 'w': [0], 'y': [0]}

Итак, вы можете видеть здесь, что он печатает правильно результирующий индексный массив для каждого «id», но в конце переменная класса индексы просто показывает, не знаю, что.

PS: На самом деле я не верю в выяснении такого рода личных проблем, но я борюсь с этим, так как целый день. Я спросил одного друга и после некоторого боя, он также сказал, что все кажется мне хорошим.

Так я жду ответа и урока, чтобы узнать от него :)

Спасибо заранее.

+0

Присвоение списка другой переменной и передача списка в качестве параметра не создайте копию списка. В тот же список будут ссылаться новые переменные. – thefourtheye

+0

то, что я должен делать? следует использовать ** _ list = list(); _ list = index_list **? Я предполагаю, что ** list() ** создаст новый пустой список. Я прав? – pravj

+0

Учитывая список, 'the_list', используя' new_list = the_list [:] ', создаст копию списка, который можно изменить, не затрагивая исходный список. – IanAuld

ответ

0

Как указывалось в разделе комментариев, вам необходимо скопировать список.

Просто замените

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

с

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

Причиной вы видели странный результат является то, что все узлы же мастер ветви дерева получает то же _list объекта, назначенные им. И так как вы делаете _list.pop(), окончательный _list становится списком только индекса верхнего уровня.

Также node['ch'] должен быть node['node'] в вашем фрагменте кода. Я предполагаю, что это просто ошибка ввода :-)

Смежные вопросы