Я имею дело со структурой JSON, которая выводится мне в виде таких структур:
[{u'item': u'something',
u'data': {
u'other': u'',
u'else':
[
{
u'more': u'even more',
u'argh':
{
...etc..etc
Как вы видите, это вложенные массивы и списки. Существует много дискуссий о рекурсивном уплощении этих структур, но я пока не нашел ни одной, которая могла бы справиться со списком словарей, которые в свою очередь могут содержать либо словари списков, либо списки списков, либо словари словарей и т.д.; глубина которых неизвестна! В некоторых случаях глубина может достигать 100 или около того. Пока что я пробую это без особого успеха (python 2.7.2):
def flatten(structure):
out = []
for item in structure:
if isinstance(item, (list, tuple)):
out.extend(flatten(item))
if isinstance(item, (dict)):
for dictkey in item.keys():
out.extend(flatten(item[dictkey]))
else:
out.append(item)
return out
Есть идеи?
UPDATE Это практически работает:
def flatten(l):
out = []
if isinstance(l, (list, tuple)):
for item in l:
out.extend(flatten(item))
elif isinstance(l, (dict)):
for dictkey in l.keys():
out.extend(flatten(l[dictkey]))
elif isinstance(l, (str, int, unicode)):
out.append(l)
return out