68

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

例子:

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

7 回答 7

118

我不知道有什么方法可以做到。但是您可以使用列表理解

>>> [aList[i] for i in myIndices]
于 2012-08-07T13:52:58.787 回答
15

绝对使用列表推导,但这里有一个函数可以做到这一点(没有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')
于 2012-08-07T14:05:17.147 回答
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']

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

于 2012-09-06T11:48:55.990 回答
7

你可以使用map

map(aList.__getitem__, myIndices)

或者operator.itemgetter

f = operator.itemgetter(*aList)
f(myIndices)
于 2015-07-27T08:55:55.017 回答
3

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

(aList[i] for i in myIndices) 
于 2016-01-20T21:15:22.780 回答
2

我对这些解决方案不满意,所以我创建了一个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']
于 2015-04-04T15:03:13.987 回答
2

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

>>> list(map(lambda i: aList[i], myIndices))
['a', 'd', 'e']
于 2020-09-22T14:33:56.933 回答