如何在Python中编辑多层嵌套列表的指定索引元素?
动态替换嵌套列表中指定层级的元素(数学表达式解析树场景)
针对你在构建数学表达式解析树时遇到的动态替换指定层级分支的问题,这里提供两种简洁的实现方式,既能根据bookmarks索引序列精准定位替换位置,也不会破坏原有树结构:
迭代实现(推荐,高效直观)
通过迭代遍历bookmarks的前n-1个索引,定位到目标元素的父节点,最后替换父节点中对应索引的元素:
def replace_branch(tree, bookmarks, branch): parent = tree # 遍历到目标元素的父节点 for idx in bookmarks[:-1]: parent = parent[idx] # 替换目标位置的元素 parent[bookmarks[-1]] = branch
测试你的场景
第一次迭代替换:
bookmarks = [0] tree = ["(x-1)(x+2)+1"] branch = ["+",["*","(x-1)","(x+2)"],"1"] replace_branch(tree, bookmarks, branch) # 替换后tree为:[["+",["*","(x-1)","(x+2)"],"1"]]
第二次迭代替换:
bookmarks = [0,1] tree = [["+",["*","(x-1)","(x+2)"],"1"]] branch = ["*",["-","x","1"],"(x+2)"] replace_branch(tree, bookmarks, branch) # 替换后tree为:[["+", ["*", ["-", "x", "1"], "(x+2)"], "1"]]
递归实现
如果你偏好递归风格,可以通过逐层递归定位到目标层级后替换元素:
def replace_branch_recursive(tree, bookmarks, branch): if len(bookmarks) == 1: tree[bookmarks[0]] = branch return # 递归进入下一层级 replace_branch_recursive(tree[bookmarks[0]], bookmarks[1:], branch)
保留原树结构(可选)
如果需要完全保留原始tree不被修改,可以先对其进行深拷贝,再操作拷贝后的对象:
import copy original_tree = [["+",["*","(x-1)","(x+2)"],"1"]] new_tree = copy.deepcopy(original_tree) bookmarks = [0,1] branch = ["*",["-","x","1"],"(x+2)"] replace_branch(new_tree, bookmarks, branch) # original_tree 仍保持不变,new_tree为修改后的结构
内容的提问来源于stack exchange,提问作者Mello Mantra
相关产品推荐
相关产品推荐

