在多维列表索引中使用splat运算符

2024-04-25 20:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有清单

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

我有一个索引,我想用它来访问这个列表的元素。在

^{pr2}$

我想用像

a[*index] = 9

意思是a[index[0]][index[1]] = 9,但这不起作用,a[**index] = 9也不起作用。有没有类似的方法可以在没有索引调用链的情况下做到这一点?在

我想有一个方法来做到这一点,而不使用任何必须导入的库。在


Tags: 方法元素列表index情况pr2
2条回答

首先,a[c, d, e]等价于a[(c, d, e)],后者等价于a.__getitem__((c, d, e))。注意双括号。任何想要更好地使用Python数据模型的__getitem__实现都需要一个(显式)参数。在

这就是为什么从[]内部的index解包值没有多大意义。a[*index]将给您一个SyntaxErrora.__getitem__(*index)将给您一个TypeError(因为您提供的参数太多)。在

标准Python列表期望整型参数为__getitem__,但是numpy支持元组索引(numpy数组仍然只接受__getitem__的一个参数,但它可以是元组)。在

演示:

>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6]])
>>> a[(1,2)]
6

当然,你可以省略括号,因为

^{pr2}$

完全相同。在

您可以使用^{},它是标准库的一部分:

>>> a = [[1, 2, 3], 
...      [4, 5, 6]]
>>> index = [1, 2]

>>> import functools, operator
>>> functools.reduce(operator.getitem, index, a)
6

或者,您可以编写自己的类来支持这种多维索引:

^{pr2}$

否则,仅使用列表而不使用循环或其他函数是不可能的。在

相关问题 更多 >