【问题标题】:Python: filtering lists by indicesPython:按索引过滤列表
【发布时间】:2012-08-04 13:23:32
【问题描述】:

在 Python 中,我有一个元素列表 aList 和一个索引列表 myIndices。有什么方法可以一次检索aList 中的所有项目,并将myIndices 中的值作为索引?

例子:

>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> myIndices = [0, 3, 4]
>>> aList.A_FUNCTION(myIndices)
['a', 'd', 'e']

【问题讨论】:

  • [aList[i] for i in myIndices]
  • 如果你只想遍历元素,我建议改用生成器表达式:(aList[i] for i in myIndices)

标签: python list filter indexing


【解决方案1】:

或者,您可以使用 maplambda 函数来使用函数式方法。

>>> list(map(lambda i: aList[i], myIndices))
['a', 'd', 'e']

【讨论】:

    【解决方案2】:

    如果您不需要同时访问所有元素的列表,而只是希望迭代地使用子列表中的所有项目(或将它们传递给将要使用的东西),那么使用生成器表达式会更有效,而不是比列表理解:

    (aList[i] for i in myIndices) 
    

    【讨论】:

      【解决方案3】:

      你可以使用map

      map(aList.__getitem__, myIndices)
      

      operator.itemgetter

      f = operator.itemgetter(*aList)
      f(myIndices)
      

      【讨论】:

        【解决方案4】:

        我对这些解决方案不满意,所以我创建了一个 Flexlist 类,它只是扩展了 list 类,并允许通过整数、切片或索引列表进行灵活的索引:

        class Flexlist(list):
            def __getitem__(self, keys):
                if isinstance(keys, (int, slice)): return list.__getitem__(self, keys)
                return [self[k] for k in keys]
        

        然后,对于您的示例,您可以将其用于:

        aList = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
        myIndices = [0, 3, 4]
        vals = aList[myIndices]
        
        print(vals)  # ['a', 'd', 'e']
        

        【讨论】:

        • 这个很有用。
        【解决方案5】:

        列表索引可以在numpy中完成。将基本列表转换为 numpy 数组,然后应用另一个列表作为索引:

        >>> from numpy import array
        >>> array(aList)[myIndices]
        array(['a', 'd', 'e'], 
          dtype='|S1')
        

        如果需要,最后转换回列表:

        >>> from numpy import array
        >>> a = array(aList)[myIndices]
        >>> list(a)
        ['a', 'd', 'e']
        

        在某些情况下,此解决方案可能比列表理解更方便。

        【讨论】:

          【解决方案6】:

          绝对使用列表推导,但这里有一个函数可以做到这一点(list 没有方法可以做到这一点)。然而,这是对 itemgetter 的不好使用,但只是为了知识,我已经发布了这个。

          >>> from operator import itemgetter
          >>> a_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
          >>> my_indices = [0, 3, 4]
          >>> itemgetter(*my_indices)(a_list)
          ('a', 'd', 'e')
          

          【讨论】:

          • @BasicWolf 是的,你不应该使用它,但 OP 要求提供一个可以做到这一点的函数,所以我只是展示了它是什么。我会更明确地说明你不应该使用它。
          • 我认为这也会受到函数可以拥有的最大参数数量的限制。
          • 这也不会导致列表;但这是次要的。
          • 问题中的案例不是使用itemgetter 的正确案例,但至少有一个案例是正确答案并且遇到了这个问题。 (即我的。)
          • @wizzwizz4 回想起来,我觉得 itemgetter 在这里看起来很棒,它还针对速度进行了高度优化。
          【解决方案7】:

          我不知道有什么方法可以做到这一点。但是你可以使用list comprehension:

          >>> [aList[i] for i in myIndices]
          

          【讨论】:

            猜你喜欢
            • 2013-09-19
            • 2018-10-29
            • 1970-01-01
            • 2021-07-23
            • 2022-06-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多