Python:按索引过滤列表

时间:2012-08-07 13:51:14

标签: python list filter indexing

在Python中,我有一个元素列表aList和一个索引列表myIndices。有什么方法可以一次性检索aListmyIndices>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>> myIndices = [0, 3, 4] >>> aList.A_FUNCTION(myIndices) ['a', 'd', 'e'] 中的值作为索引的所有项目吗?

示例:

{{1}}

7 个答案:

答案 0 :(得分:66)

我不知道有任何方法可以做到这一点。但您可以使用list comprehension

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

答案 1 :(得分:9)

绝对使用列表推导,但这是一个执行它的函数(没有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')

答案 2 :(得分: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']

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

答案 3 :(得分:4)

您可以使用map

map(aList.__getitem__, myIndices)

operator.itemgetter

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

答案 4 :(得分:3)

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

(aList[i] for i in myIndices) 

答案 5 :(得分:2)

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

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']

答案 6 :(得分:0)

或者,您可以使用maplambda函数的功能方法。

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