如果我有list
,例如:
lst = [[1,2,3], [4,5,6], [7,8,9]]
和另一个list
,其[row, column]
中的元素包含index
list
,例如:
index = [2, 1]
显然,我可以使用element
获取index
:
lst[index[0]][index[1]]
然而,我发现这个syntax
非常笨重,并且不适合大块代码。如果维度list
更高,情况也会变得更糟。
我的问题:有更简单的方法来执行此操作index
吗?
看起来像是:
lst[index]
会更具可读性,但这不是Python的工作方式,因此不是一种选择。
答案 0 :(得分:2)
由于您正在使用2D列表,因此使用numpy
可能是个好主意。然后,您只需要定义index
as a tuple。但是,索引3
将超出范围:
>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> index = (1, 2)
>>> a[index]
6
您正在寻找的方法在Ruby中称为Array#dig
:
[[1,2,3], [4,5,6], [7,8,9]].dig(1, 2)
# 6
但我找不到任何普通的Python等价物。
答案 1 :(得分:2)
你可以创建一个迭代索引的简单函数。对于索引中的每个元素,只需从对象获取项目并将其指定为新对象。迭代完整个索引后返回当前对象。正如@EricDuminil所说,它适用于dicts和支持__getitem__
的所有其他对象:
def index(obj, idx):
for i in idx:
obj = obj[i]
return obj
LST = [[1,2,3], [4,[5],6], [{'foo': {'bar': 'foobar'}},8,9]]
INDEXES = [[2, 2], [1, 1, 0], [2, 0, 'foo', 'bar']]
for i in INDEXES:
print('{0} -> {1}'.format(i, index(LST, i)))
输出:
[2, 2] -> 9
[1, 1, 0] -> 5
[2, 0, 'foo', 'bar'] -> foobar
答案 2 :(得分:1)
您使用的方法可能是最简单的方法,但为了更好的可读性,您可以选择类似
的方法i = index[0]
j = index[1]
x = lst[i][j]
无论如何,您需要将索引列表拆分为2个值。如果你想整理你的主要代码块,你可以编写一个函数来处理这个问题,但这很难“更容易”。
编辑:如下所示,元组解包是一个更好的选择
i, j = index
x = lst[i][j]