Python: 根据索引过滤列表

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

例如:

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

我不知道有什么方法可以做到这一点。但是你可以使用 列表内涵:

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

当然可以使用列表内涵,但这里有一个函数可以做到这一点(目前还没有 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')

通过列表进行索引可以在 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']

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

我对这些解决方案不满意,所以我创建了一个 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']

你可以用 map

map(aList.__getitem__, myIndices)

operator.itemgetter

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

如果你不需要一个可以同时访问所有元素的列表,而只是希望迭代地使用子列表中的所有项目(或者将它们传递给某个可以同时访问所有元素的列表内涵) ,那么使用生成器表达式比使用生成器表达式更有效:

(aList[i] for i in myIndices)

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

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