在Python中通过引用访问深度列表嵌套值

在Python中通过引用访问深度列表嵌套值,python,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]]]] > m

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

谢谢

您可以通过使用相应的索引访问每个子列表来确定它。使用最后一个索引指定值:

def set_nested_val(l, indices, val):
  for i in indices[:-1]:
    l = l[i]
  l[indices[-1]] = val
请注意,此函数对任意列表(第一个参数)进行操作,而不仅仅是
l
。如果要始终修改
l
,请使用:


请注意,嵌套列表和通过标记访问值通常是糟糕数据体系结构的标志。您考虑过键为元组的子列表吗?

您可以通过使用相应的索引访问它来确定每个子列表。使用最后一个索引指定值:

def set_nested_val(l, indices, val):
  for i in indices[:-1]:
    l = l[i]
  l[indices[-1]] = val
def modify_list(indices, new_value):
    x = reduce(lambda x, i: x[i], indices[:-1], l)
    x[indices[-1]] = new_value
请注意,此函数对任意列表(第一个参数)进行操作,而不仅仅是
l
。如果要始终修改
l
,请使用:

请注意,嵌套列表和通过标记访问值通常是糟糕数据体系结构的标志。你考虑过一个键是元组的数组吗

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]]]]
例如:

>>> 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]]]]
试试这个:

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
或者这个:

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]]]]
试试这个:

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
或者这个:

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

这是家庭作业吗?如果不是,为什么你需要这样的功能?哈哈哈,对不起没有作业,我想这个问题看起来很简单。我过了一天,这个例子过于简单化,无法表达我的问题。这是家庭作业吗?如果不是,为什么你需要这样的功能?哈哈哈,对不起没有作业,我想这个问题看起来很简单。我今天心情不好,这个例子被过分简化了,无法表达我的问题。谢谢。我没有想到使用list[index]传递最后一个索引就足够了,所以我被卡住了。列表示例是我试图做的一个过于简单的示例。我同意做嵌套列表很可能不是正确的做法。谢谢。我没有想到使用list[index]传递最后一个索引就足够了,所以我被卡住了。列表示例是我试图做的一个过于简单的示例。我同意做嵌套列表很可能不是正确的做法。