Сложный список срез / индекс в python
у меня есть список, который выглядит так:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
Я хотел бы создать отфильтрованный список, который выглядит следующим образом:
filtered_lst = [2, 6, 7, 9, 10, 13]
предоставляет ли Python Соглашение для пользовательского среза. Что-то вроде:
lst[1, 5, 6, 8, 9, 12] # slice a list by index
5 ответов
использовать operator.itemgetter()
:
from operator import itemgetter
itemgetter(1, 5, 6, 8, 9, 12)(lst)
демо:
>>> from operator import itemgetter
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> itemgetter(1, 5, 6, 8, 9, 12)(lst)
(2, 6, 7, 9, 10, 13)
это возвращает кортеж; приведение к списку с list(itemgetter(...)(lst))
если это требование.
обратите внимание, что это эквивалент выражения среза (lst[start:stop]
) С набором индексов вместо диапазона; его нельзя использовать в качестве назначения среза левой стороны (lst[start:stop] = some_iterable
).
массивы numpy имеют такой синтаксис:
In [45]: import numpy as np
In [46]: lst = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
In [47]: lst[[1, 5, 6, 8, 9, 12]]
Out[47]: array([ 2, 6, 7, 9, 10, 13])
это легко и прямо сделано с использованием понимания списка.
lst = range(1, 14)
indices = [1, 5, 6, 8, 9, 12]
filtered_lst = [lst[i] for i in indices]
Я бы пошел с operator.itemgetter()
метод, который предложил Martijn Pieters, но вот другой способ (для полноты)
In [23]: lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
In [24]: indices = set([1, 5, 6, 8, 9, 12])
In [25]: [n for i,n in enumerate(lst) if i in indices]
Out[25]: [2, 6, 7, 9, 10, 13]
срез Python позволяет сделать срез целью назначения. И синтаксис нарезки Python не допускает срезов с нерегулярными шаблонами индексов. Таким образом, если вы хотите сделать свой "пользовательский" срез целью назначения, это невозможно с синтаксисом среза Python.
Если ваши требования выполнены, взяв копию указанных элементов, то operator.itemgetter()
отвечает вашим потребностям. Если вам нужно назначение среза, то numpy срезы являются хорошим вариантом.