Python嵌套列表:如何自动获取目标元素的索引或对象地址并替换
嵌套列表中目标元素的索引与对象地址获取方案
1. 递归遍历获取完整索引路径
由于你的列表是多层嵌套结构,可通过递归遍历每一层元素,找到目标值时记录它的完整索引路径,自动得到类似[1][0][1][1]的索引:
def get_nested_index(lst, target, current_path=None): if current_path is None: current_path = [] for idx, elem in enumerate(lst): if elem == target: return current_path + [idx] # 当前元素是列表时,继续递归查找 if isinstance(elem, list): found_path = get_nested_index(elem, target, current_path + [idx]) if found_path: return found_path return None lis = [['a', ['b'], 'c'], [['d', ['p', ['q']]], 'e', 'f']] if 'q' in str(lis): q_index = get_nested_index(lis, 'q') print(f"'q'的索引路径: {q_index}") # 通过索引路径获取对象地址 elem = lis for i in q_index: elem = elem[i] q_id = id(elem) print(f"'q'的对象地址: {q_id}") # 直接修改元素 parent = lis for i in q_index[:-1]: parent = parent[i] parent[q_index[-1]] = 'z' print("修改后的列表:", lis)
2. 直接获取对象地址
如果仅需要目标元素的内存地址,可在递归遍历中找到元素时直接返回它的id():
def get_nested_id(lst, target): for elem in lst: if elem == target: return id(elem) if isinstance(elem, list): elem_id = get_nested_id(elem, target) if elem_id: return elem_id return None lis = [['a', ['b'], 'c'], [['d', ['p', ['q']]], 'e', 'f']] if 'q' in str(lis): q_id = get_nested_id(lis, 'q') print(f"'q'的对象地址: {q_id}")
额外说明:你的ctypes用法无需存在
你代码里通过id和ctypes操作列表属于冗余操作,Python列表是可变对象,直接通过索引操作原列表就能完成修改,比如lis[1][0][1][1] = 'z',和你用ctypes的效果完全一致。
内容的提问来源于stack exchange,提问作者Santhosh Kumar
相关产品推荐
相关产品推荐

