求可返回嵌套列表指定索引元素左值(引用)的Python函数
实现嵌套列表的左值定位函数
Python里没法直接返回元素的"引用",但我们可以通过定位目标元素的父容器+最后一个索引来实现你要的左值效果,完美适配你的apply函数需求。
核心实现方案
修改part_lval函数,让它返回目标元素所在的父容器,以及该元素在父容器中的索引。然后在apply里通过父容器直接修改原元素:
def part_lval(lst, *ind): # 遍历到倒数第二个索引,拿到目标元素的父容器 parent = lst for i in ind[:-1]: parent = parent[i] # 返回父容器和最后一个索引 return parent, ind[-1] def apply(lst, f, ind): parent, idx = part_lval(lst, *ind) # 直接修改父容器中的对应位置,等价于 a[1][0] = f(a[1][0]) parent[idx] = f(parent[idx])
测试验证
写个测试用的f函数,比如把字符串转大写,列表元素批量转大写:
def f(x): if isinstance(x, str): return x.upper() elif isinstance(x, list): return [item.upper() for item in x] return x # 测试第一个示例 a = ['a',['b','c']] apply(a, f, [1]) print(a) # 输出: ['a', ['B', 'C']] # 测试第二个示例 a = ['a',['b','c']] apply(a, f, [1, 0]) print(a) # 输出: ['a', ['B', 'c']]
为什么原右值函数不行?
你的原part函数返回的是元素的值(不可变类型如str是副本,可变类型如list是对象引用,但赋值res = f(res)只会改变局部变量res,不会修改原嵌套列表的结构)。比如:
a = ['a',['b','c']] res = part(a,1,0) res = 'B' print(a) # 还是['a',['b','c']],因为res只是拿到了'b'的副本,赋值不影响原列表
而我们的方案通过直接操作父容器的索引位置,真正修改了原嵌套列表的内容,完全符合你要的a[1][0] = f(a[1][0])的效果。
内容的提问来源于stack exchange,提问作者Hayashi Yoshiaki
相关产品推荐
相关产品推荐

