1

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

谢谢

4

3 回答 3

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]]]]
于 2012-06-10T18:28:07.660 回答
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谁的键是元组?

于 2012-06-10T18:22:54.267 回答
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]]]]
于 2012-06-10T18:29:22.280 回答