0

オブジェクトのリストを取得し、オブジェクトの「キー」に基づいてネストされた辞書の辞書に再配置しようとしています。各キーには、既知のパターンで親ディクショナリのキーが含まれています。私が遭遇している問題は、次のような要素にアクセスできることです...

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']

...それに追加するために動的に。キーに基づいて辞書をトラバースするある種の再帰関数を構築する方法はありますか?たとえば、キー「1.2.3.4.5」でオブジェクトを追加する必要がある場合、それを行う方法はありますか...

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']['1.2.3.4.5'] = {...}

...動的かつ再帰的に?

私が始めているリストはキーでソートされているので、現在のオブジェクトの親の「アセット」ディクショナリを常に追加できるようにする必要があることに注意してください。

4

2 に答える 2

1

再帰を使用できますdefaultdict

>>> from collections import defaultdict
>>> l = lambda: defaultdict(l)
>>> d = defaultdict(l)
>>> d['123']['4234']['asd']['dsaf'] = 4
>>> d
    defaultdict(<function <lambda> at 0x15f9578>, {'123': defaultdict(<function <lambda> at 0x15f9578>, {'4234': defaultdict(<function <lambda> at 0x15f9578>, {'asd': defaultdict(<function <lambda> at 0x15f9578>, {'dsaf': 4})})})})
于 2013-03-05T07:14:55.917 に答える
0

私が問題を抱えていたのは思ったよりも簡単だったことがわかりました。私がする必要があるのはこのようなものだけでした:

hier_data = {}
for id in sorted(data.iterkeys()):
  key = id.split('.')
  data[id]['Assets'] = {}
  insert_point = hier_data
  for i in range(len(key)/2-1):
    insert_point = insert_point['.'.join(key[0:2*i+2])]['Assets']
  insert_point[id] = data[id]
return hier_data

辞書(たとえば)からキーを取得するhier_data[...]と、オブジェクトへのポインタではなく、辞書内のその時点でオブジェクトのコピーが返されると思いました。必要なのは、分割されたキーを繰り返し処理して、insert_pointカーソルを正しい場所に移動してオブジェクトに追加することだけでした。

于 2013-03-07T04:58:08.213 に答える