Flattening a list of dicts of lists of dicts (etc) of unknown depth in Python (nightmarish JSON structure)

Я имею дело со структурой 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
6
задан LittleBobbyTables 12 December 2011 в 16:56
поделиться