Python:按索引过滤列表

78
在Python中,我有一个元素列表aList和一个索引列表myIndices。是否有任何方法可以一次性检索出在aList中具有与myIndices中值相同的索引的所有项目?
例如:
>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> myIndices = [0, 3, 4]
>>> aList.A_FUNCTION(myIndices)
['a', 'd', 'e']

8
[aList[i] for i in myIndices] 可以翻译为“对于myIndices中的每个i,在aList中获取索引为i的元素并将其放入一个新列表中”。 - Morwenn
4
如果您只想遍历元素,我建议使用生成器表达式:(aList[i] for i in myIndices) - hochl
7个回答

131

我不知道任何实现这个的方法。但你可以使用一个列表推导式

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

16

一定要使用列表推导式,但这里提供一个函数来完成它(没有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要求一个能够实现这个功能的函数,所以我只是展示了它是什么。我会更明确地说明你不应该使用这个函数。 - jamylak
我认为这也会受到函数最大参数限制的限制。 - Paddy3118
这也不会导致一个列表;但这只是小问题。 - Burhan Khalid
这个问题中的情况并不适合使用 itemgetter,但至少有一种情况是正确的答案,并且在遇到这个问题时会用到它。(也就是我的情况。) - wizzwizz4
回顾一下,我认为在这里使用itemgetter非常好,它还高度优化了速度。 - jamylak

11

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

在某些情况下,这种解决方案可能比列表推导更方便。


10

你可以使用map

map(aList.__getitem__, myIndices)

或者operator.itemgetter

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

5

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

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

4
如果您不需要同时访问所有元素的列表,而只是希望迭代使用子列表中的所有项目(或将它们传递给会使用它们的东西),那么使用生成器表达式比列表推导式更有效率。
(aList[i] for i in myIndices) 

3

我不满意这些解决方案,因此我创建了一个名为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']

这非常有用。 - mikeTronix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接