Выбор элементов из списка 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 в списковом включении