访问列表的多个元素知道他们的索引

我需要从列表中select一些元素,了解它们的索引。 假设我想创build一个新的列表,其中包含索引为1,2,5的元素从给定列表[-2,1,5,3,8,5,6]。 我做的是:

a = [-2,1,5,3,8,5,6] b = [1,2,5] c = [ a[i] for i in b] 

有没有更好的方法来做到这一点? 像c = a [b]的东西?

你可以使用operator.itemgetter

 >>> from operator import itemgetter >>> a = [-2, 1, 5, 3, 8, 5, 6] >>> b = [1, 2, 5] >>> print itemgetter(*b)(a) (1, 5, 5) 

或者你可以使用numpy :

 >>> import numpy as np >>> a = np.array([-2, 1, 5, 3, 8, 5, 6]) >>> b = [1, 2, 5] >>> print list(a[b]) [1, 5, 5] 

但是,真的,你现在的解决scheme是好的。 这可能是所有这些中最好的。

备择scheme:

 >>> map(a.__getitem__, b) [1, 5, 5] 

 >>> import operator >>> operator.itemgetter(*b)(a) (1, 5, 5) 

基本和不是非常广泛的testing,比较五个答案的执行时间:

 def numpyIndexValues(a, b): na = np.array(a) nb = np.array(b) out = list(na[nb]) return out def mapIndexValues(a, b): out = map(a.__getitem__, b) return list(out) def getIndexValues(a, b): out = operator.itemgetter(*b)(a) return out def pythonLoopOverlap(a, b): c = [ a[i] for i in b] return c multipleListItemValues = lambda searchList, ind: [searchList[i] for i in ind] 

使用以下input:

 a = range(0, 10000000) b = range(500, 500000) 

简单的Python循环是最快的lambda操作closures第二,mapIndexValues和getIndexValues一贯非常相似与numpy方法后转换列表numpy数组显着较慢。如果数据已经在numpy数组numpyIndexValues方法与numpy.array转换删除是最快的。

 numpyIndexValues -> time:1.38940598 (when converted the lists to numpy arrays) numpyIndexValues -> time:0.0193445 (using numpy array instead of python list as input, and conversion code removed) mapIndexValues -> time:0.06477512099999999 getIndexValues -> time:0.06391049500000001 multipleListItemValues -> time:0.043773591 pythonLoopOverlap -> time:0.043021754999999995 

我相信这个问题已经被考虑过了:如果b中的索引数量很小且不变,那么可以写出如下结果:

 c = [a[b[0]]] + [a[b[1]]] + [a[b[2]]] 

如果指数本身是常量,甚至更简单…

 c = [a[1]] + [a[2]] + [a[5]] 

或者如果有连续的指数范围…

 c = a[1:3] + [a[5]] 

另一个解决scheme可以通过pandas系列:

 import pandas as pd a = pd.Series([-2, 1, 5, 3, 8, 5, 6]) b = [1, 2, 5] c = a[b] 

然后,您可以将c转换回列表,如果你想:

 c = list(c) 

我的答案不使用numpy或python集合。

寻找要素的一个微不足道的方法如下:

 a = [-2, 1, 5, 3, 8, 5, 6] b = [1, 2, 5] c = [i for i in a if i in b] 

缺点:此方法可能无法适用于较大的列表。 build议在较大的列表中使用numpy。