Как получить подсписок из списка в Python по заданным индексам?
У меня есть список в Python, например, a = [0, 1, 2, 3, 4, 5, 6]
. Также у меня есть список индексов: b = [0, 2, 4, 5]
. Как мне получить список элементов из a
по индексам, указанным в b
?
4 ответ(ов)
Вы можете использовать генератор списков для получения этого списка:
c = [a[index] for index in b]
print(c)
Это эквивалентно следующему коду:
c = []
for index in b:
c.append(a[index])
print(c)
Вывод:
[0, 2, 4, 5]
Примечание:
Помните, что some_list[index]
— это синтаксис, используемый для доступа к элементу списка по конкретному индексу.
Многие из предложенных решений могут привести к возникновению ошибки KeyError
, если массив b
содержит индекс, которого нет в массиве a
. Если вы хотите избежать ошибок и пропустить недействительные индексы, можно использовать следующий подход:
>>> b = [0, 2, 4, 5]
>>> a = [0, 1, 2, 3, 4, 5, 6]
>>> [x for i, x in enumerate(a) if i in b]
[0, 2, 4, 5]
>>> b = [0, 2, 4, 500]
>>> [x for i, x in enumerate(a) if i in b]
[0, 2, 4]
Здесь используется функция enumerate
, которая возвращает кортежи, содержащие пары индекс-значение. Поскольку у нас есть как элемент, так и его индекс, мы можем проверить наличие индекса в массиве b
и избежать ошибок. Таким образом, если индекс из b
не существует в a
, он просто будет пропущен, и это обеспечит корректное выполнение кода.
Использование numpy.asarray
позволяет получить подмассив из массива по списку индексов. Рассмотрим пример:
import numpy as np
a = [0, 10, 20, 30, 40, 50, 60] # Исходный список
b = [0, 2, 4, 5] # Список индексов для извлечения
res = np.asarray(a)[b].tolist() # Преобразуем список в массив и выбираем элементы по индексам
print(res) # Вывод: [0, 20, 40, 50]
В данном примере массив a
преобразуется в объект NumPy, и с помощью списка индексов b
извлекаются соответствующие элементы. Результат преобразуется обратно в список с помощью метода tolist()
. В результате получаем список [0, 20, 40, 50]
, содержащий элементы из исходного списка a
, соответствующие индексам из b
.
Ещё один альтернативный способ для достижения лучшей производительности, если это для вас важно - хотя он и не самый питонический, я уверен, что он наиболее эффективен:
>>> list(filter(lambda x: a.index(x) in b, a))
[0, 2, 4, 5]
Примечание: В Python 2 нет необходимости преобразовывать в list
. Однако в Python 3 и более поздних версиях это необходимо (если будущие посетители столкнутся с подобной проблемой).
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Диапазон букв в Python
Нахождение среднего значения списка
Вывод списка в обратном порядке с помощью функции range()
Доступ к атрибутам на литералах работает для всех типов, кроме `int`; почему?