Python:按索引过滤列表

Posted

技术标签:

【中文标题】Python:按索引过滤列表【英文标题】:Python: filtering lists by indices 【发布时间】: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) 【参考方案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]

【讨论】:

以上是关于Python:按索引过滤列表的主要内容,如果未能解决你的问题,请参考以下文章

Python:用另一个列表过滤列表列表

在Python中按属性获取对象列表中的索引

按索引过滤对象数组

Python:返回从列表中过滤的对象的 index() 列表

最佳列表理解(过滤现有列表)

django按类别列出,带有indexview和detailview类