说我有清单
a = [[1, 2, 3],
[4, 5, 6]]
我有一个索引,我想用它来访问这个列表的元素。
index = [1,2]
我想使用像
这样的东西a[*index] = 9
表示a[index[0]][index[1]] = 9
,但这不起作用,a[**index] = 9
也不起作用。如果没有一连串的索引调用,是否有类似的方法呢?
我想要一种方法来执行此操作,而不使用任何必须导入的库。
答案 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]
将为您提供SyntaxError
,a.__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
完全等效。