为了账号安全,请及时绑定邮箱和手机立即绑定

如何将嵌套的 python 列表转换为 c 结构?

如何将嵌套的 python 列表转换为 c 结构?

DIEA 2022-01-05 12:25:48
我得到了一个“json 解析器”python 模块,它解析 json 文件并从 json 文件返回一个结构列表。我被要求编写一个 python 模块,该模块接受这个列表并将其转换为一个充满 c 结构的“.h”文件。我的问题是 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 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

对于递归列表处理,您需要确定您正在查看的是列表还是叶子:


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 风格的嵌套结构。


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信