の問題 - 階層/複数のネストされたdictsにdictsのリストを変換する:のpython - 現在、私はこれらの入力を持って受注
query = [{'id': 1, 'desc': 'desc_father', 'parent_id': None}
,{'id': 2, 'desc': 'desc_child_1', 'parent_id': 10}
,{'id': 3, 'desc': 'desc_child_2', 'parent_id': 2}
,{'id': 4, 'desc': 'desc_child_5', 'parent_id': 5}
,{'id': 5, 'desc': 'desc_child_6', 'parent_id': 6}
,{'id': 6, 'desc': 'desc_child_1', 'parent_id': 1}]
は、これは私の再帰関数である:
def recursive(parent_list, child_dict, parent_id):
for l in parent_list:
if parent_id in l.values():
if 'children' not in l:
l['children'] = []
l['children'].append(child_dict)
break
else:
for i in l:
if isinstance(l[i], list):
recursive(d[i], child_dict, parent_id)
return parent_list
これは私のメインのコードです:
results = []
for q in query:
dict_item = {}
dict_item['id'] = q['id']
dict_item['desc'] = q['desc']
if q['parent_id'] is None:
results.append(dict_item)
else:
results= recursive(results, dict_item, q['parent_id'])
return results
ので、上記のデータとコードで、私は以下のように結果を持っています。
[{
'desc' : 'desc_father',
'id' : 1,
'children' : [{
'desc' : 'desc_child_1',
'id' : 2,
'children' : [{
'desc' : 'desc_child_2',
'id' : 3
}
]
}, {
'desc' : 'desc_child_1',
'id' : 6
}
]
}
]
あなたがループの中に、これらの項目の親がまだ作成されていないので(id = 5
& id = 6
を持つアイテムを)id = 4
とid = 5
を持つアイテムが不足して見ることができたので、この結果はあります。私は子供の前に父親の項目を作成するためにリストを前後にどのようにトラバースするかわからないので、この問題を修正するのが難しいです。ヘルプは高く評価されます。前もって感謝します。
を更新し
私はid = 2
とアイテムである私のクエリのための一つのケースに追加している私たちが持っていないので、この時間は、項目は、10(parent_id = 10
)にそのPARENT_IDを更新しています返品の結果でid = 10
を親として持つので、このid = 2
アイテムもルートになります。
私の新しいコードはScott Hunterのガイダンスに基づいていますが、まだ動作させることができませんでした。私はどこか誤解している必要があります:
new_dict = {}
for q in query:
q['Children'] = []
new_dict[q['id']] = q
for k, v in new_dict.iteritems():
print k, v
if v['parent_id'] is not None and v['parent_id'] in new_dict:
new_dict[k]['Children'].append(v)
print new_dict
が更新-2
を今私は以下のコードを参照してください、スコット・ハンターの提案に基づいて、それが動作するようにします。しかし、コードはあまりにも多くのために醜いように見える、とにかく私はこれを完璧にすることができますか?あなたのサポートのために多くのおかげで、もう一つのステップとそれが行われます!
new_dict = {}
for q in query:
q['children'] = []
q['parent'] = 1
new_dict[q['id']] = q
for k, v in new_dict.iteritems():
p_id = v['parent_id']
for kk, vv in new_dict.iteritems():
if kk == p_id:
v['parent'] = 0
vv['children'].append(v)
results = []
for d_id, d_item in new_dict.iteritems():
if d_item['parent'] == 1:
results.append(d_item)
print results
なぜ 'v'を自分の子供の1人にしていますか? –
こんにちは@ScottHunter、私はそれを働かせるようにしました。私のコードを見直してください。ありがとうございました。 – Leo