【发布时间】:2021-01-20 15:56:45
【问题描述】:
我有一个任意嵌套的值数组,如下所示:
['"multiply"', 'ALAssn ', ['ACmp ', ['Ge ', ['Var "n"'], ' ', ['Num 0']]], ['ALAssn ', ['ACmp ', ['Eq ', ['Var "p"'], ' ', ['Mul ', ['Var "n"'], ' ', ['Var "m"']]]]]
我需要尝试找出一种方法来解析数组中的每个值并对其进行格式化:
- 每个长度为 1 的数组被分成两个单独的值:
-- 示例: ['Var "n"'] 现在应该变成 ["Var", "n"] 和 ['Num 0'] 现在变成 ["Num", 0]。
- 空列表值的所有实例都被删除。
-- 示例: ['Ge ', ['Var "n"'], ' ', ['Num 0']] 现在变为 ['Ge ', ['Var "n"'], ['Num 0']]
- 删除任何字符串中的空格。
-- 示例: 'Ge ' 现在变为 'Ge'
给定的 sn-p 是需要解析的更大字符串的一部分。我明白在高层次上需要做什么..ie:
-
一旦我得到一个长度为 1 的列表,
list.split(" ")将拆分为两个单独的元素,然后修剪arr[1]以去除多余的引号 -
如果
el是列表中每个元素的空字符串,list.remove(el) -
遍历时检查每个元素的
if isinstance(el, string),如果为真,el.replace(" ", "")以消除空格。
我唯一的问题是遍历列表中的每个元素。我已经尝试递归和迭代地这样做,但到目前为止还无法破解它。
理想情况下,我会遍历每一个元素,然后在找到符合条件的元素后,将该元素设置为我想要对其进行的更改。这仅适用于第 1 点和第 3 点。
编辑:
非常感谢您提供的答案。我还有一个想要添加的内容。
假设我有一个像'Reads "a"' 这样的嵌套标识符作为数组的第一个值,并且有可能在同一级别具有像Write "a" 这样的附加标识符。这些也需要转换为["Read", "a"] 格式。请参阅下面大列表中的更改。我该怎么做呢?
['Read "a"', ['Add', ['Var', 'i'], ['Num', '1']]], 'Write "a"', ['Add', ['Var', 'i'], ['Num', '1']], ['Var', 't']]
这些值'Read' 和'Write' 的意义在于,在遍历列表时,我们知道与该标识符对应的列表的下n 个元素的“类型”。我们基本上可以通过说它们是嵌套列表中唯一不会成为列表的值来区分它们。
例如: ['identifier', [], [], []]
假设已知identifier 类型包含3 个列表,first、second、third。例如,目标是读取标识符,然后将 first、second 和 third 存储为树中的节点。
【问题讨论】:
标签: python arrays string recursion traversal