Выбор элементов из списка Python по определённым индексам
У меня есть задача, с которой, как мне кажется, можно легко справиться в 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 ответ(ов)
Этот код вернет список объектов, используя генератор списка.
Я думаю, что решение Ювала А. довольно ясно и просто. Но если вы хотите использовать однострочное выражение для получения списка с помощью генератора списков, вот как это можно сделать:
[e for i, e in enumerate(main_list) if i in indexes]
Это решение создаёт новый список, включающий элементы из main_list
, которые находятся на позициях, указанных в indexes
.
Ваш код создает новый список t
, в который добавляются элементы из main_list
, индексируемые значениями в списке indexes
. Если вы хотите узнать, как выполнить эту задачу более эффективно, вы можете использовать списковое включение (list comprehension) для упрощения записи:
t = [main_list[i] for i in indexes]
return t
Этот способ более питонический и удобочитаемый. Если вам нужно более подробное объяснение или возникли другие вопросы, не стесняйтесь уточнять!
В вашем коде используется функция map
, которая применяет функцию lambda
ко всем элементам списка indexes
. А именно, каждый элемент x
из indexes
используется как индекс для получения соответствующего элемента из main_list
.
Чтобы перевести этот код на русский, можно оформить ответ следующим образом:
# Пример использования map с lambda
result = list(map(lambda x: main_list[x], indexes))
Этот код создаёт новый список result
, в который будут помещены элементы из main_list
, соответствующие индексам из списка indexes
. Обратите внимание, что для получения списка из результата map
необходимо обернуть его в list()
, так как map
возвращает итератор.
Если у вас есть дополнительные вопросы по этому коду или его функционалу, пожалуйста, уточните!
В качестве альтернативы списковому включению вы можете использовать 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 мс на итерацию
%timeit list(map(L.__getitem__, idx)) # 417 мс на итерацию
Для "ленивого" итератора вы можете просто использовать map(L.__getitem__, idx)
. Обратите внимание, что в Python 2.7 map
возвращает список, поэтому нет необходимости передавать его в list
.
Как получить последний элемент списка?
Как найти индекс элемента в списке?
Как удалить элемент из списка по индексу
Создать список из одного элемента, повторенного N раз
if else в списковом включении