Есть ли способ нарезать список по его простым индексам?

Позволять

a = [1, 2, ... 99, 100] # numbers 1 to 100
b = [2, 3, ... 89, 97] # prime numbers under 100

Есть ли питонический способ нарезать a на b?

i.e.

a[b]

вывод будет

[3, 4, ... 90, 98]

person Linsu Han    schedule 12.03.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как в Python индексировать список с помощью другой список?   -  person Sebastian Dziadzio    schedule 12.03.2020


Ответы (2)


Поскольку есть тег numpy:

import numpy as np
a = np.array(a)
b = np.array(b)

result = a[b]

Сравнение производительности по времени:

import numpy as np
N=100_000

a = list(range(N))
b = list(range(1, N, 3))

c = np.array(a)
d = np.array(b)

Понимание списка

%timeit [a[i] for i in b]
2.31 ms ± 456 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Нумпи

%timeit c[d]
115 µs ± 7.57 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Используя простой тест, мы видим, что numpy работает в 20 раз быстрее с массивом длиной 100_000, однако это некорректное сравнение, поскольку я не учитываю время на импорт библиотеки и преобразование списков в массивы.

В качестве последнего замечания: на самом деле нет необходимости также преобразовывать b в массив numpy.

person FBruzzesi    schedule 12.03.2020

Как насчет:

result = [a[i] for i in b]
person Sebastian Dziadzio    schedule 12.03.2020