Python 在给定索引的情况下,如何以编程方式在嵌套列表中设置元素?

Python 在给定索引的情况下,如何以编程方式在嵌套列表中设置元素?,python,Python,我想在给定索引列表的任意嵌套列表中设置一个元素。例如,假设我们有以下列表: a = [[1, 2], [3, 4, 5]] 我们可以设置如下元素: a[1][2] = 9 修改后的列表a为: [[1, 2], [3, 4, 9]] 我想根据索引列表设置此元素:[1,2] 谢谢 为清晰起见进行编辑:索引列表的长度可能会有所不同。例如,给定索引列表:idx=[1,2],如建议,我们可以执行以下操作: a[idx[0]][idx[1]] = 9 然而,在更一般的情况下,idx可以是任何长度。我

我想在给定索引列表的任意嵌套列表中设置一个元素。例如,假设我们有以下列表:

a = [[1, 2], [3, 4, 5]]
我们可以设置如下元素:

a[1][2] = 9
修改后的列表
a
为:

[[1, 2], [3, 4, 9]]
我想根据索引列表设置此元素:
[1,2]

谢谢

为清晰起见进行编辑:索引列表的长度可能会有所不同。例如,给定索引列表:
idx=[1,2]
,如建议,我们可以执行以下操作:

a[idx[0]][idx[1]] = 9
然而,在更一般的情况下,
idx
可以是任何长度。我想要像这样的东西:

a[idx[i_1]][idx[i_2]][...][idx[i_n]] = 9

可以使用按元组索引的词典:

my_dict = dict()
my_dict[4, 5] = 3
my_dict[4, 6] = 'foo'
my_dict[2, 7] = [1, 2, 3]


for key in my_dict:
    print(key, my_dict[key])

# (4, 5) 3
# (4, 6) foo
# (2, 7) [1, 2, 3]

可以使用按元组索引的词典:

my_dict = dict()
my_dict[4, 5] = 3
my_dict[4, 6] = 'foo'
my_dict[2, 7] = [1, 2, 3]


for key in my_dict:
    print(key, my_dict[key])

# (4, 5) 3
# (4, 6) foo
# (2, 7) [1, 2, 3]

尝试此操作以获得o/p:[[1,9],[3,4,9]]

 a = [[1, 2], [3, 4, 5]]
    z=len(a)
    for i in range(0,z):
        a[i][len(a[i])-1]=9
    print (a,len(a[0]))

尝试此操作以获得o/p:[[1,9],[3,4,9]]

 a = [[1, 2], [3, 4, 5]]
    z=len(a)
    for i in range(0,z):
        a[i][len(a[i])-1]=9
    print (a,len(a[0]))
我找到了一个解决方案:

def set_in_list(a, idx, val): """ Set an element to value `val` in a nested list `a`. The position of the element to set is given by the list `idx`. Example: `a` = [[1, 2], [3, [4, 5], 6], [7]] `idx` = [1,1,0] `val` = 9 ==> `a` = [[1, 2], [3, [9, 5], 6], [7]] """ for i in range(len(idx) - 1): a = a[idx[i]] a[idx[-1]] = val def set_在_列表中(a、idx、val): """ 在嵌套列表“a”中将元素的值设置为“val”。位置 要设置的元素的名称由列表“idx”给出。 例子: `a`=[[1,2],[3,4,5,6],[7]] `idx`=[1,1,0] `val`=9 ==>`a`=[[1,2]、[3,9,5,6]、[7]] """ 对于范围内的i(len(idx)-1): a=a[idx[i]] a[idx[-1]]=val 我找到了一个解决方案:

def set_in_list(a, idx, val): """ Set an element to value `val` in a nested list `a`. The position of the element to set is given by the list `idx`. Example: `a` = [[1, 2], [3, [4, 5], 6], [7]] `idx` = [1,1,0] `val` = 9 ==> `a` = [[1, 2], [3, [9, 5], 6], [7]] """ for i in range(len(idx) - 1): a = a[idx[i]] a[idx[-1]] = val def set_在_列表中(a、idx、val): """ 在嵌套列表“a”中将元素的值设置为“val”。位置 要设置的元素的名称由列表“idx”给出。 例子: `a`=[[1,2],[3,4,5,6],[7]] `idx`=[1,1,0] `val`=9 ==>`a`=[[1,2]、[3,9,5,6]、[7]] """ 对于范围内的i(len(idx)-1): a=a[idx[i]] a[idx[-1]]=val
您可以通过递归实现这一点:

def get_deep(l, indices):
     if (len(indices) > 1) and isinstance(l[indices[0]], list):
         return get_deep(l[indices[0]], indices[1:])
     else:
         return l[indices[0]]

def set_deep(l, indices, value):
     if (len(indices) > 1) and isinstance(l[indices[0]], list):
         set_deep(l[indices[0]], indices[1:], value)
     else:
         l[indices[0]] = value
因此:


请注意,如果您将中的
list
类更改为
(list,dict)
等,则这也适用于混合嵌套dict/列表。

您可以使用递归执行此操作:

def get_deep(l, indices):
     if (len(indices) > 1) and isinstance(l[indices[0]], list):
         return get_deep(l[indices[0]], indices[1:])
     else:
         return l[indices[0]]

def set_deep(l, indices, value):
     if (len(indices) > 1) and isinstance(l[indices[0]], list):
         set_deep(l[indices[0]], indices[1:], value)
     else:
         l[indices[0]] = value
因此:


请注意,如果您将中的
list
类更改为
(list,dict)
等,则这也适用于混合嵌套的dict/列表。

这可能有助于澄清您在示例中显示a的前后的意图。您的意思是这样的吗
b=[1,2]
a[b[0][b[1]]=9
@ASmallShellScript:谢谢,我已经添加了修改后列表应该是什么。当你说“任意嵌套列表”时,你的意思是索引列表可以是任意长度的,还是总是像你的示例[x,y]中的2深,但是x和y可以是任何值?@ASmallShellScript:索引列表可以是任何长度。请看我的编辑。谢谢。这可能有助于澄清你的意图,在你的例子中展示一段时间的前后关系。你的意思是这样的吗
b=[1,2]
a[b[0][b[1]]=9
@ASmallShellScript:谢谢,我已经添加了修改后列表应该是什么。当你说“任意嵌套列表”时,你的意思是索引列表可以是任意长度的,还是总是像你的示例[x,y]中的2深,但是x和y可以是任何值?@ASmallShellScript:索引列表可以是任何长度。请看我的编辑。谢谢。我想你的问题是如何将每个内部列表的最后一个元素的值改为9,是吗?@S T Mohammed:这只是一个例子。通常,该列表将被任意嵌套,因此它们可能超过两个级别。我希望能够设置一个元素,其位置由一系列索引定义。谢谢。你能通过给出一个既有输入又有预期输出的示例来进一步澄清你的问题吗?从你给出的示例中,我认为你需要将每个内部列表的最后一个元素的值更改为9。我想你的问题是如何将每个内部列表的最后一个元素的值更改为9,是吗?@S T Mohammed:这只是一个示例。通常,该列表将被任意嵌套,因此它们可能超过两个级别。我希望能够设置一个元素,其位置由一系列索引定义。谢谢。你能通过给出一个既有输入又有预期输出的示例来进一步澄清你的问题吗?从你给出的示例中,我认为你需要将每个内部列表的最后一个元素的值改为9