在python中迭代任意嵌套数组并更改匹配值
我有一个任意嵌套的值数组,如下所示:在python中迭代任意嵌套数组并更改匹配值,python,arrays,string,recursion,traversal,Python,Arrays,String,Recursion,Traversal,我有一个任意嵌套的值数组,如下所示: ['"multiply"', 'ALAssn ', ['ACmp ', ['Ge ', ['Var "n"'], ' ', ['Num 0']]], ['ALAssn ', ['ACmp ', ['Eq ', ['Var "p"'], ' ', ['Mul ', ['Var "n"'], ' ', ['Var "m"']]]]] def process(ls
['"multiply"', 'ALAssn ', ['ACmp ', ['Ge ', ['Var "n"'], ' ', ['Num 0']]], ['ALAssn ', ['ACmp ', ['Eq ', ['Var "p"'], ' ', ['Mul ', ['Var "n"'], ' ', ['Var "m"']]]]]
def process(lst):
if len(lst) == 1: # special case for one-element lists
result = lst[0].split()
result[1] = result[1].strip('"') # strip quotation marks
return result
result = []
for item in lst:
if isinstance(item, list):
result.append(process(item)) # recurse on nested lists
else: # item is a string
stripped = item.strip() # remove leading and trailing whitespace
if stripped:
result.append(stripped) # keep only non-empty strings
return result
我需要尝试找出一种方法来解析数组中的每个值,并对其进行格式化,以便:
['Var“n”]
现在应该变成[“Var”,“n”]
,['Num 0']
现在变成[“Num”,0]
['Ge',['Var“n'”],'',['Num 0']
现在变成['Ge',['Var“n'”],['Num 0']
现在变成'Ge'
给定的代码段是需要解析的更大字符串的一部分。我理解在高水平上需要做什么,即:
list.split(“”)
将其拆分为两个单独的元素,然后修剪arr[1]
以去掉多余的引号
el
都是空字符串,list.remove(el)
“读取”a“
,作为数组的第一个值,并且有可能在同一级别中有其他标识符,如写入”a“
。这些文件还需要转换为[“Read”,“a”]
格式。请参见下面大列表中的更改。我该怎么做呢
['Read "a"', ['Add', ['Var', 'i'], ['Num', '1']]], 'Write "a"', ['Add', ['Var', 'i'], ['Num', '1']], ['Var', 't']]
这些值'Read'
和'Write'
的意义在于,当遍历列表时,我们知道与该标识符对应的列表中接下来n个元素的“类型”。我们可以通过说它们是嵌套列表中唯一不会成为列表本身的值来区分它们
例如:
假设已知标识符
类型包含3个列表,第一个
,第二个
,第三个
。例如,目标是读取标识符,然后将第一个
、第二个
和第三个
存储为树中的节点。这个问题似乎最容易处理,方法是用固定的项构建一个新列表,而不是试图修改现有的列表。这将允许您使用递归来处理嵌套,同时对每个列表的扁平部分使用迭代
我会这样构造代码:
['"multiply"', 'ALAssn ', ['ACmp ', ['Ge ', ['Var "n"'], ' ', ['Num 0']]], ['ALAssn ', ['ACmp ', ['Eq ', ['Var "p"'], ' ', ['Mul ', ['Var "n"'], ' ', ['Var "m"']]]]]
def process(lst):
if len(lst) == 1: # special case for one-element lists
result = lst[0].split()
result[1] = result[1].strip('"') # strip quotation marks
return result
result = []
for item in lst:
if isinstance(item, list):
result.append(process(item)) # recurse on nested lists
else: # item is a string
stripped = item.strip() # remove leading and trailing whitespace
if stripped:
result.append(stripped) # keep only non-empty strings
return result
似乎可以将1和3折叠为一个操作:
def消毒(项目):
如果存在(项目、列表):
如果长度(项目)==1:
项=项[0]。拆分()
返回[项目中i的输出if(输出:=消毒(i))]
返回项。删除(“”)#删除“””和“”。
项目=['multiply'、'ALAssn'、['ACmp'、['Ge'、['Var“n”]、''、['Num 0']]、['ALAssn'、['ACmp'、['Eq'、['Var“p”]、''、['ACmp'、['Var“n”]、''、['Var“m”]、'.['Var“m”]]
消毒(项目)
#返回:['multiply','ALAssn',['ACmp',['Ge',['Var','n'],['Num','0']],['ALAssn',['ACmp','Eq',['Var','p'],['Mul',['Var','n'],['Var','m']]]]
这是一个干净的解决方案,但是你知道我如何修改它来处理我所做的编辑吗?最后一行,item.strip(“”),是字符串值的总括。将该字符串转换为您需要的任何内容。此解决方案简单易懂,但可以根据编辑进行调整吗?编辑的特殊情况似乎没有指定。是什么使“read”成为“'
与众不同?空间?引号?'read'
和'write'
是硬编码的特殊情况吗?详细说明这一点以及实现它的方法应该很简单。更糟糕的是,您可能需要一个简单的正则表达式测试。'Read'
和Write
是嵌套列表中唯一不会成为列表本身的值。例如:['identifier',[],[],[],[]标识符的点是,当遍历列表时,我们知道与该标识符对应的列表中接下来n个元素的“类型”。我还将此添加到问题中,以便更容易理解