更改嵌套列表中的特定条目

时间:2018-08-07 14:04:38

标签: python list nested

假设我们得到一个嵌套列表,如下所示:

a = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

我们想将1更改为'one'。为此,我们只需执行a[0][0][0] = 'one'

如何编写一个函数来做到这一点?特别是,我想定义一个函数foo,该函数带有一个嵌套列表(嵌套深度可以变化)和一个索引列表(在我说明的情况下为[0, 0, 0])和一个替换值(在我提供的示例中为'one'),并返回嵌套列表,其中指定索引中的元素已替换。

要将其链接回我给出的示例,该函数应执行以下操作:

>> foo(a, [0, 0, 0], 'one') 
[[['one', 2], [3, 4]], [[5, 6], [7, 8]]]

尽管我使用Python已有一段时间,但这似乎并不简单。

2 个答案:

答案 0 :(得分:4)

您可以将functools.reduceoperator.getitem结合使用:

a = [[[1,2],[3,4]], [[5,6],[7,8]]]

from functools import reduce
from operator import getitem

def foo(L, idx, var):
    reduce(getitem, idx[:-1], L)[idx[-1]] = var

foo(a, [0,0,0], 'one') 

print(a)

[[['one', 2], [3, 4]], [[5, 6], [7, 8]]]

答案 1 :(得分:-1)

我建议您使用这个简单的功能foo(),不要导入任何包:

def foo(a, b, value):
    c = a
    for i in b[:-1]:
        c = c[i]
    c[b[-1]] = value

a = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
foo(a, [0, 0, 0], 'one') 

print(a)
# [[['one', 2], [3, 4]], [[5, 6], [7, 8]]]

a = [[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]]
foo(a, [0, 0, 0, 1], 'two') 

print(a)
# [[[[1, 'one'], [3, 4]], [[5, 6], [7, 8]]]]

我还建议您使用以下递归函数:

def foo(a, b, value):
    if len(b) == 1:
        a[b[0]] = value
    else:
        foo(a[b[0]], b[1:], value)