假设我们得到一个嵌套列表,如下所示:
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已有一段时间,但这似乎并不简单。
答案 0 :(得分:4)
您可以将functools.reduce
与operator.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)