从具有特定索引的python列表中挑选项目

时间:2009-04-07 09:43:33

标签: python list list-comprehension

我确信在Python中有一个很好的方法可以做到这一点,但我对这门语言很陌生,所以请原谅我,如果这很容易!

我有一个列表,我想从该列表中挑选出某些值。我想要选择的值是列表中的索引在另一个列表中指定的值。

例如:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]
输出将是:

[9, 2, 6]

(即main_list中索引为2,4和5的元素)。

我觉得这应该是可行的,使用像列表推导这样的东西,但我无法弄清楚(特别是,我无法弄清楚如何使用列表理解时访问项目的索引)。

6 个答案:

答案 0 :(得分:85)

[main_list[x] for x in indexes]

这将使用列表推导返回对象列表。

答案 1 :(得分:4)

t = []
for i in indexes:
    t.append(main_list[i])
return t

答案 2 :(得分:2)

我认为Yuval A的解决方案非常简单明了。但如果你真的想要一行列表理解:

[e for i, e in enumerate(main_list) if i in indexes]

答案 3 :(得分:1)

map(lambda x:main_list[x],indexes)

答案 4 :(得分:0)

作为列表理解的替代方法,可以将maplist.__getitem__一起使用。对于大型列表,您应该会看到更好的性能:

import random

n = 10**7
L = list(range(n))
idx = random.sample(range(n), int(n/10))

x = [L[x] for x in idx]
y = list(map(L.__getitem__, idx))

assert all(i==j for i, j in zip(x, y))

%timeit [L[x] for x in idx]            # 474 ms per loop
%timeit list(map(L.__getitem__, idx))  # 417 ms per loop

对于惰性迭代器,您可以只使用map(L.__getitem__, idx)。请注意,在Python 2.7中,map返回一个列表,因此不需要传递给list

答案 5 :(得分:0)

如果您擅长使用numpy

import numpy as np
main_array = np.array(main_list) # converting to numpy array
out_array = main_array.take([2, 4, 5])
out_list = out_array.tolist() # if you want a list specifically