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

时间:2018-05-21 17:19:20

标签: python python-3.x

说我有清单

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

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

index = [1,2]

我想使用像

这样的东西
a[*index] = 9

表示a[index[0]][index[1]] = 9,但这不起作用,a[**index] = 9也不起作用。如果没有一连串的索引调用,是否有类似的方法呢?

我想要一种方法来执行此操作,而不使用任何必须导入的库。

2 个答案:

答案 0 :(得分:2)

您可以使用reduce(),它是标准库的一部分:

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

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

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

import functools, operator

class Matrix:

    def __init__(self, lst):
        self._lst = lst

    def __getitem__(self, index):
        return functools.reduce(operator.getitem, index, self._lst)


a = Matrix([[1, 2, 3],
            [4, 5, 6]])
index = [1, 2]

print(a[index])  # -> 6

否则,仅使用列表和没有循环或其他功能是不可能的。

答案 1 :(得分:1)

首先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

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

>>> a[1,2]
6

完全等效。