【问题标题】:Indexing a 2D List with another List用另一个列表索引 2D 列表
【发布时间】:2018-04-02 01:30:55
【问题描述】:

如果我有list,例如:

lst = [[1,2,3], [4,5,6], [7,8,9]]

另一个list 包含[row, column] index 用于list 中的一个元素,例如:

index = [2, 1]

显然我可以通过以下方式在index 获得element

lst[index[0]][index[1]]

但是,我发现这个syntax 非常笨重,不能很好地放在一大段代码中。更高维度的list 也会变得更糟。

我的问题:有没有更简单的方法来做到这一点index

好像是这样的:

lst[index]

会更具可读性,但这不是 Python 的工作方式,因此不是一个选择。

【问题讨论】:

  • 你可以先i, j = index 然后lst[i][j]

标签: python list indexing


【解决方案1】:

由于您使用的是二维列表,因此使用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 等价物。

【讨论】:

    【解决方案2】:

    您可以创建一个简单的函数来迭代索引。对于索引中的每个元素,只需从对象中获取项目并将其分配为新对象。遍历整个索引后,返回当前对象。正如@EricDuminil 所指出的,它适用于字典和所有其他支持__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
    

    【讨论】:

    • +1 不错的简洁功能 - 尤其适用于n 尺寸。但是,我认为numpy 解决方案更简洁!
    • 不错。作为奖励,它也适用于听写(如果你小心的话)。 [[1,2,3], [4,[5],6], [7,8,9, {'a':'b'}]]index(lst, [2, 3, 'a']).
    【解决方案3】:

    您使用的方法可能是最简单的方法,但为了更好的可读性,您可以使用类似

    i = index[0]
    j = index[1]
    x = lst[i][j]
    

    无论如何,您需要将索引列表拆分为 2 个值。如果你想整理你的主要代码块,你可以编写一个函数来处理它,但这几乎不会“更容易”。

    编辑:如下所示,元组解包是一个更好的选择

    i, j = index
    x = lst[i][j]
    

    【讨论】:

    • 或者,使用元组解包,i, j = index / x = lst[i][j]
    猜你喜欢
    • 2017-04-09
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多