我有一个包含嵌套列表的列表,我想创建一个函数(modify_list
),它获取一个元组并使用传递的值参数修改传递的指针。问题是我不知道如何通过引用以编程方式修改嵌套值。
简化示例:
l = [[1, [2,3, [4,5,6]]]]
如果我调用函数modify_list
,这些将是如何使用它和预期的结果:
> l[0][1][2][2]
6
> modify_list((0, 1, 2, 2), 8)
> l
[[1, [2,3, [4,5,8]]]]
> modify_list((0, 1, 1), 14)
> l
[[1, [2,14, [4,5,8]]]]
由于
答案 0 :(得分:2)
您可以通过使用相应索引访问每个子列表来确定每个子列表。使用最后一个索引分配值:
def set_nested_val(l, indices, val):
for i in indices[:-1]:
l = l[i]
l[indices[-1]] = val
请注意,此函数在任意列表(第一个参数)上运行,而不仅仅是l
。如果您想要始终修改l
,请使用functools.partial
:
import functools
l = [[1, [2,3, [4,5,6]]]]
modify_list = functools.partial(set_nested_val, l)
请注意,嵌套列表和按指标访问值通常是错误数据架构的标志。您是否考虑过其键是元组的dict
?
答案 1 :(得分:2)
def modify_list(indices, new_value):
x = reduce(lambda x, i: x[i], indices[:-1], l)
x[indices[-1]] = new_value
示例:
>>> l = [[1, [2, 3, [4, 5, 6]]]]
>>> modify_list((0, 1, 2, 2), 8)
>>> l
[[1, [2, 3, [4, 5, 8]]]]
此方法与您在问题中所要求的内容相匹配,但传入要变异的列表而不是始终修改全局变量可能更有意义:
def modify_list(lst, indices, new_value):
x = reduce(lambda x, i: x[i], indices[:-1], lst)
x[indices[-1]] = new_value
>>> l = [[1, [2, 3, [4, 5, 6]]]]
>>> modify_list(l, (0, 1, 2, 2), 8)
>>> l
[[1, [2, 3, [4, 5, 8]]]]
答案 2 :(得分:1)
试试这个:
def modify_list(lst, pos, val):
item = lst
while len(pos) > 1:
item = item[pos[0]]
pos = pos[1:]
item[pos[0]] = val
或者这个:
def modify_list(lst, pos, val):
item = lst
for i in pos[:-1]:
item = item[i]
item[pos[-1]] = val
或者这个:
def modify_list(lst, pos, val):
reduce(lambda a, e: a[e], pos[:-1], lst)[pos[-1]] = val
无论如何,请像这样使用:
lst = [[1, [2, 3, [4, 5, 6]]]]
modify_list(lst, (0, 1, 2, 2), 8)
lst
> [[1, [2, 3, [4, 5, 8]]]]