通过Python中的引用访问深层列表嵌套值

时间:2012-06-10 18:19:24

标签: python

我有一个包含嵌套列表的列表,我想创建一个函数(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]]]]

由于

3 个答案:

答案 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]]]]