このようなリストとして表されるツリー構造を変換したいと思います...
['access_ctrl_allow',
['description', ['Access Control - Allow']],
['type', ['4']],
['metadata'],
['output', ['0']],
['rule',
['0',
['enabled', ['1']],
['action', ['type', ['accept_conn']]],
['match',
['services',
['0',
['name', ['DHCP']],
['trigger',
['0',
['protocol', ['17']],
['dst', ['start', ['67']], ['end', ['67']]],
['src', ['start', ['67']], ['end', ['68']]]]]]]]]]]
次のようなPython辞書に:
{'access_ctrl_allow': {'output': '0',
'type': '4',
'description': 'Access Control - Allow',
'rule': {'0': {'action': {'type': 'accept_conn'},
'enabled': '1',
'match': {'services': {'0': {'trigger': {'0': {'src': {'start': '67',
'end': '68'},
'dst': {'start': '67', 'end': '67'},
'protocol': '17'}},
'name': 'DHCP'}}}}},
'metadata': {}}}
私はそれを実行し、正しい出力を生成するように見えるコードを持っています...
def dictify(data):
k, v = data[0], data[1:]
if len(v) == 0:
return {k: {}}
elif len(v) == 1 and len(v[0]) == 1:
return {k: v[0][0]}
else:
new = {}
for datum in v:
new.update(dictify(datum))
return {k: new}
...しかし、それは不格好に感じます。これをクリーンアップするための提案を提供できますか?特に、list-in-a-list(v[0][0]
)を逆参照する必要があることは、より良い方法が必要であることを私に示唆しています。