0

Как получить подсписок из списка в Python по заданным индексам?

17

У меня есть список в Python, например, a = [0, 1, 2, 3, 4, 5, 6]. Также у меня есть список индексов: b = [0, 2, 4, 5]. Как мне получить список элементов из a по индексам, указанным в b?

4 ответ(ов)

0

Вы можете использовать генератор списков для получения этого списка:

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] — это синтаксис, используемый для доступа к элементу списка по конкретному индексу.

0

Многие из предложенных решений могут привести к возникновению ошибки 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, он просто будет пропущен, и это обеспечит корректное выполнение кода.

0

Использование 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.

0

Ещё один альтернативный способ для достижения лучшей производительности, если это для вас важно - хотя он и не самый питонический, я уверен, что он наиболее эффективен:

>>> list(filter(lambda x: a.index(x) in b, a))
[0, 2, 4, 5]

Примечание: В Python 2 нет необходимости преобразовывать в list. Однако в Python 3 и более поздних версиях это необходимо (если будущие посетители столкнутся с подобной проблемой).

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