Как мне преобразовать вложенные списки Python в структуры c? - PullRequest
0 голосов
/ 09 апреля 2019

Мне был предоставлен модуль Python "json parser", который анализирует файлы json и возвращает список структур из файла json. Меня попросили написать модуль python, который берет этот список и преобразует его в файл «.h», заполненный структурами c. Моя проблема в том, что файлы json могут содержать много вложенных списков (то есть вложенных списков во вложенных списках и т. Д. И т. Д.), И я просто не могу получить правильный код для доступа к ним. Также каждый элемент в этих списках имеет пару ключ-значение, называемую «позиция», и я хочу иметь возможность сортировать структуры после этой пары ключ-значение и создавать файл «.h» с отсортированными структурами, но я не уверен, что мой код сделает свое дело.

Моя идея состояла в том, чтобы создать цикл for, который проходит по списку, и если он находит другой список в этом списке, проверяет этот вложенный список на наличие большего количества вложенных списков и т. Д. Я довольно новичок в python, могу ли я решить эту проблему с помощью рекурсивной функции ? Если да, то как?

способ просмотра списков (работает только для вложенных списков в первом списке)

def test(liste):
        for inner_l in liste:
            for item in inner_l:
                print(item)

моя функция сортировки

def takeFourth(elem):
        return elem[3]

neueListe = neueListe + x.sort(key=takeFourth)

ожидаемые результаты, конечный файл .h должен выглядеть следующим образом:

struct SubStructOfSubStruct
{
    int MyInteger;
};

struct ThirdSubStructType
{
    float MyFloatValue;
    double MyDoubleValue;
    struct SubStructOfSubStructType SubStructOfSubStruct;
};

struct SubStructType
{
    float MyFloatValue;
    double MyDoubleValue;
};

struct SecondSubStructType
{
    int MyInteger;
};

struct Toplevel
{
    struct ThirdSubStructType ThirdSubStruct;
    struct SubStructType SubStruct;
    char MyString[10];
    boolean MyBoolValue;
    double MyDoubleValue;
    float MyFloatValue;
    int MyInteger;
    struct SecondSubStructType SecondSubStruct;
};

Это то место, где я нахожусь, это список, который возвращает анализатор, который я хочу просмотреть и создать структуры: (последнее значение в списках - это значение позиции, по которому я хочу отсортировать)

[['SubStructOfSubStructType ', [['Integer', 'MyInteger', 33, 0]]], 
['ThirdSubStructType ', [['TreeNode', 'SubStructOfSubStructType', 'SubStructOfSubStruct', 2], ['Double', 'MyDoubleValue', 100, 0], ['Float', 'MyFloatValue', 22, 1]]], 
['SecondSubStructType', [['Integer', 'MyInteger', 333, 0]]], 
['SubStructType', [['Double', 'MyDoubleValue', 1000, 0], ['Float', 'MyFloatValue', 222, 1]]], 
['Toplevel', [['TreeNode', 'ThirdSubStructType', 'ThirdSubStruct', 7], ['Float', 'MyFloatValue', 2, 1], ['Boolean', 'MyBoolValue', False, 2], ['Double', 'MyDoubleValue', 10, 0], ['Integer', 'MyInteger', 3, 3], ['TreeNode', 'SecondSubStructType', 'SecondSubStruct', 6], ['String', 'MyString', 'Leer', 4], ['TreeNode', 'SubStructType','SubStruct',5]]]]

1 Ответ

0 голосов
/ 10 апреля 2019

Для рекурсивной обработки списка вам необходимо определить, является ли то, что вы просматриваете, списком или листом:

def test(liste):
    if isinstance(liste,list):
        for inner_l in liste:
            test(inner_l)
    else:
        print('item: {}'.format(liste))

Поскольку вы хотите иметь возможность находить структуры и обрабатывать их как единое целое, может быть полезно иметь вспомогательные функции для определения того, что вы ищете. Вы можете использовать ту же технику для поиска шаблона метки, за которой следует один список членов:

def is_struct(liste):
    return not isinstance(liste[0],list) and isinstance(liste[1],list) and len(liste) == 2

Тогда вы можете собрать их вместе:

def test(liste):
    if isinstance(liste,list):
        if is_struct(liste):
            print('struct {}'.format(liste[0]))
            for item in liste[1]:
                print('  var: {}'.format(item))
        else:
            for inner_l in liste:
                test(inner_l)
    else:
        print('unexpected: {}'.format(liste))

Этот метод должен обрабатывать произвольно вложенные структуры списков. Вы можете расширить его для обработки вложенных структур в стиле C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...