【问题标题】:Indexing nested list by a list按列表索引嵌套列表
【发布时间】:2019-01-05 14:09:27
【问题描述】:

给定一个类似的嵌套列表

>>> m= [[3, 1], [2, 7]]

我可以得到这样的元素

>>> m[1][0]
2

如果索引在列表中给出,例如[1, 0],我如何获得相同的值?

我正在寻找 Q 编程语言通过 dot 提供的东西,如下面的代码所示

q) m: (3 1; 2 7)
q) m[1][0]
2
q) m . 1 0
2

【问题讨论】:

  • 您可以使用get 方法定义一个类,该方法将[1, 0] 作为参数。例如,此解决方案已在 pandas 中使用。 accessor = MyAccessor([[3, 1], [2, 7]]); accessor.get([1,0])

标签: python multidimensional-array indexing nested-lists


【解决方案1】:

作为一个快速n-dirty的解决方案,你可以像这样滥用functools.reduce

from functools import reduce
def get_recursive(lst, idx_list):
    return reduce(list.__getitem__, [lst, *idx_list])

>>> y = [[3, 1], [2, 7]]
>>> get_recursive(y, [0, 1])
1
>>> get_recursive(y, [1, 0])
2

有很多极端情况需要处理(另外,您必须确保路径存在,否则会处理出现的任何错误),但这应该可以帮助您入门。

【讨论】:

    【解决方案2】:

    只需定义一个递归函数,获取传入列表的索引,然后将该索引和切片索引列表传递给自身,直到切片索引列表为空:

    def get(m,l):
        if not l:
            return m
        return get(m[l[0]],l[1:])
    
    print(get([[3, 1], [2, 7]],[1,0]))
    

    打印:2

    【讨论】:

      【解决方案3】:

      你可以先转换成NumPy数组:

      import numpy as np
      
      m = [[3, 1], [2, 7]]
      np.array(m)[1,0]
      

      输出:

      2
      

      【讨论】:

      • 并非如此。也许 OP 不想为此安装和使用 numpy。也许列表是参差不齐的,等等。解决方案并不像您想象的那么简单,是吗? (在编辑之前回复您的原始帖子)
      • 好吧,OP 从来没有提到过使用/不使用 numpy。这个 numpy 参数通常可用于大多数 Python 标签的答案/cmets。我假设索引实际上是指一个元素。我不明白你为什么投反对票。无论如何,这是你的意见。与其他人相比,我只是提供了一个相对简单的解决方案。
      • 可以,但这通常并不意味着这样做是合适的。为什么你认为我对你的帖子投了反对票?
      • l= [1, 0] 的语法是什么
      • 答案是l=[1,0]。什么意思?
      【解决方案4】:

      此解决方案需要导入,但只能来自标准库。与@cs95's solution 非常相似,但在我看来稍微干净一些。

      from functools import reduce
      from operator import getitem
      
      nested_list = [[[['test'], ['test1']], ['test2']], ['test3', 'test4']]
      indices = [0, 1, 0]
      
      assert reduce(getitem, indices, nested_list) == 'test2'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-02
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        相关资源
        最近更新 更多