0

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

このコードを実行すると、トレース中に各ノードの正しい結果が出力されますが、実行の最後に、インデックスクラス変数 ( dict object ) に奇妙な値が残り、それを理解できません。なぜですか?

これが実行結果です。これには、上記の jsonデータを使用しました。

ツリー = ツリー (データ)

そして、これを出力します:

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」ごとに正しい結果のインデックス配列が出力されることがわかりますが、最後にクラス変数のインデックスが表示されているだけで、何がわかりません。

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 に答える