Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中迭代任意嵌套数组并更改匹配值_Python_Arrays_String_Recursion_Traversal - Fatal编程技术网

在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
我需要尝试找出一种方法来解析数组中的每个值,并对其进行格式化,以便:

  • 长度为1的每个数组被拆分为两个单独的值:
  • --示例:
    ['Var“n”]
    现在应该变成
    [“Var”,“n”]
    ['Num 0']
    现在变成
    [“Num”,0]

  • 将删除空列表值的所有实例
  • --示例:
    ['Ge',['Var“n'”],'',['Num 0']
    现在变成
    ['Ge',['Var“n'”],['Num 0']

  • 任何字符串中的空白都将被删除
  • --示例:
    现在变成
    'Ge'

    给定的代码段是需要解析的更大字符串的一部分。我理解在高水平上需要做什么,即:

  • 一旦我得到一个长度为1的列表,
    list.split(“”)
    将其拆分为两个单独的元素,然后修剪
    arr[1]
    以去掉多余的引号

  • 如果列表中每个元素的
    el
    都是空字符串,
    list.remove(el)

  • 检查遍历时每个元素的isinstance(el,string),如果为true,则检查el.replace(“,”),以去除空白

  • 我唯一的问题是遍历列表中的每个元素。我已经尝试过递归和迭代地这样做,但到目前为止还不能破解它

    理想情况下,我遍历每一个元素,然后一旦找到符合条件的元素,就将该元素设置为我想要对其进行的更改。这只是第1点和第3点的情况

    编辑:

    非常感谢你给出的答案。我还有一件事要补充

    也假设我有一个嵌套的标识符,如
    “读取”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个元素的“类型”。我还将此添加到问题中,以便更容易理解