0

Выбор элементов из списка Python по определённым индексам

50

У меня есть задача, с которой, как мне кажется, можно легко справиться в 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 ответ(ов)

1

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

0

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

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

Это решение создаёт новый список, включающий элементы из main_list, которые находятся на позициях, указанных в indexes.

0

Ваш код создает новый список t, в который добавляются элементы из main_list, индексируемые значениями в списке indexes. Если вы хотите узнать, как выполнить эту задачу более эффективно, вы можете использовать списковое включение (list comprehension) для упрощения записи:

t = [main_list[i] for i in indexes]
return t

Этот способ более питонический и удобочитаемый. Если вам нужно более подробное объяснение или возникли другие вопросы, не стесняйтесь уточнять!

0

В вашем коде используется функция 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 возвращает итератор.

Если у вас есть дополнительные вопросы по этому коду или его функционалу, пожалуйста, уточните!

0

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь