知道其索引的多个列表元素

时间:2013-08-16 11:20:46

标签: python list indexing elements

我需要从给定列表中选择一些元素,知道它们的索引。假设我想创建一个新列表,其中包含索引为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]?

8 个答案:

答案 0 :(得分:169)

您可以使用operator.itemgetter

from operator import itemgetter 
a = [-2, 1, 5, 3, 8, 5, 6]
b = [1, 2, 5]
print(itemgetter(*b)(a))
# Result:
(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]))
# Result:
[1, 5, 5]

但实际上,您目前的解决方案还不错。它可能是所有这些中最好的。

答案 1 :(得分:38)

备选方案:

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

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

答案 2 :(得分:5)

另一种解决方案可能是通过熊猫系列:

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)

答案 3 :(得分:2)

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

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

如果索引本身是常量,甚至更简单......

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

或者,如果有一系列连续的指数......

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

答案 4 :(得分:2)

这是一种更简单的方法:

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

答案 5 :(得分:0)

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

查找元素的一个简单方法如下:

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

缺点:此方法可能不适用于较大的列表。对于较大的列表,建议使用numpy。

答案 6 :(得分:0)

静态索引和小列表?

请不要忘记,如果列表很小并且索引没有更改,例如您的示例,有时最好的方法是使用sequence unpacking

_,a1,a2,_,_,a3,_ = a

性能要好得多,您还可以保存一行代码:

 %timeit _,a1,b1,_,_,c1,_ = a
10000000 loops, best of 3: 154 ns per loop 
%timeit itemgetter(*b)(a)
1000000 loops, best of 3: 753 ns per loop
 %timeit [ a[i] for i in b]
1000000 loops, best of 3: 777 ns per loop
 %timeit map(a.__getitem__, b)
1000000 loops, best of 3: 1.42 µs per loop

答案 7 :(得分:0)

某种pythonic方式:

c = [x for x in a if a.index(x) in b]