Как получить подсписок из списка в 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`; почему?