使用另一个列表索引2D列表

时间:2017-10-20 20:02:39

标签: python list indexing

如果我有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的工作方式,因此不是一种选择。

3 个答案:

答案 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]