如何将嵌套的 python 列表转换为 C 结构?
How do I convert nested python lists to c structures?
我得到了一个 "json parser" python 模块,它解析 json 文件和 returns 来自 json 文件的结构列表。我被要求编写一个 python 模块,它接受这个列表并将其转换为一个充满 c 结构的“.h”文件。我的问题是 json 文件可以包含许多嵌套列表(意思是嵌套列表中的嵌套列表等),我似乎无法获得正确的代码来访问这些列表。
此外,这些列表的每个元素都有一个名为 "position" 的键值对,我希望能够在此键值对之后对结构进行排序,并创建一个具有排序结构的“.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;
};
这是我所在的位置,这是解析器 returns 的列表,我想通过它来创建以下结构:
(列表中的最后一个值是我要排序的 "position" 值)
[['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]]]]
对于递归列表处理,您需要确定您正在查看的是列表还是叶子:
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 风格的嵌套结构。
我得到了一个 "json parser" python 模块,它解析 json 文件和 returns 来自 json 文件的结构列表。我被要求编写一个 python 模块,它接受这个列表并将其转换为一个充满 c 结构的“.h”文件。我的问题是 json 文件可以包含许多嵌套列表(意思是嵌套列表中的嵌套列表等),我似乎无法获得正确的代码来访问这些列表。 此外,这些列表的每个元素都有一个名为 "position" 的键值对,我希望能够在此键值对之后对结构进行排序,并创建一个具有排序结构的“.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;
};
这是我所在的位置,这是解析器 returns 的列表,我想通过它来创建以下结构: (列表中的最后一个值是我要排序的 "position" 值)
[['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]]]]
对于递归列表处理,您需要确定您正在查看的是列表还是叶子:
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 风格的嵌套结构。