これは楽しいものです。再帰を使用して解決しました。
def parse(d):
return parse_dict(d)
def parse_dict(d):
items = []
for key, val in d.iteritems():
if isinstance(val, dict):
# use dot notation for dicts
items += ['{}.{}'.format(key, vals) for vals in parse_dict(val)]
elif isinstance(val, list):
# use bracket notation for lists
items += ['{}{}'.format(key, vals) for vals in parse_list(val)]
else:
# just use the key for everything else
items.append(key)
return items
def parse_list(l):
items = []
for idx, val in enumerate(l):
if isinstance(val, dict):
items += ['[{}].{}'.format(idx, vals) for vals in parse_dict(val)]
elif isinstance(val, list):
items += ['[{}]{}'.format(idx, vals) for vals in parse_list(val)]
else:
items.append('[{}]'.format(val))
return items
ここに私の結果があります:
>>> parse(x)
['a', 'b.c', 'd[0].e', 'd[0].f', 'd[1].e', 'd[1].f']
編集
Fj の回答が気に入ったので、ここでもジェネレーターを使用しています。
def parse(d):
return list(parse_dict(d))
def parse_dict(d):
for key, val in d.iteritems():
if isinstance(val, dict):
# use dot notation for dicts
for item in parse_dict(val):
yield '{}.{}'.format(key, item)
elif isinstance(val, list):
# use bracket notation
for item in parse_list(val):
yield '{}{}'.format(key, item)
else:
# lowest level - just use the key
yield key
def parse_list(l):
for idx, val in enumerate(l):
if isinstance(val, dict):
for item in parse_dict(val):
yield '[{}].{}'.format(idx, item)
elif isinstance(val, list):
for item in parse_list(val):
yield '[{}]{}'.format(idx, item)
else:
yield '[{}]'.format(val)
同じ結果:
>>> parse(x)
['a', 'b.c', 'd[0].e', 'd[0].f', 'd[1].e', 'd[1].f']