Выделение элементов из списка Python, которые имеют определенные индексы - PullRequest
26 голосов
/ 07 апреля 2009

Я уверен, что есть хороший способ сделать это в Python, но я довольно плохо знаком с языком, так что простите, если это легко!

У меня есть список, и я хотел бы выбрать определенные значения из этого списка. Значения, которые я хочу выбрать, это те, чьи индексы в списке указаны в другом списке.

Например:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]

вывод будет:

[9, 2, 6]

(т.е. элементы с индексами 2, 4 и 5 из main_list).

У меня такое ощущение, что это должно быть выполнимо с использованием чего-то вроде списочных пониманий, но я не могу понять это (в частности, я не могу понять, как получить доступ к индексу элемента при использовании понимания списка).

Ответы [ 5 ]

85 голосов
/ 07 апреля 2009
[main_list[x] for x in indexes]

Это вернет список объектов, используя понимание списка.

4 голосов
/ 07 апреля 2009
t = []
for i in indexes:
    t.append(main_list[i])
return t
2 голосов
/ 07 апреля 2009

Я думаю, что решение Ювала А довольно простое и понятное. Но если вам действительно нужно понимание списка в одну строку:

[e for i, e in enumerate(main_list) if i in indexes]
1 голос
/ 07 апреля 2009
map(lambda x:main_list[x],indexes)
0 голосов
/ 23 августа 2018

В качестве альтернативы пониманию списка, вы можете использовать map с list.__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.

...