Python: фильтрация списков по индексам

В Python у меня есть список элементов aList и список индексов myIndices. Есть ли способ получить все сразу те элементы в aList, имеющие в качестве индексов значения в myIndices?

Пример:

>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> myIndices = [0, 3, 4]
>>> aList.A_FUNCTION(myIndices)
['a', 'd', 'e']

Ответ 1

Я не знаю, как это сделать. Но вы можете использовать понимание :

>>> [aList[i] for i in myIndices]

Ответ 2

Определенно используйте понимание списка, но вот функция, которая делает это (для этого не существует методов list). Это, однако, плохое использование itemgetter, но только ради знания я опубликовал это.

>>> from operator import itemgetter
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> my_indices = [0, 3, 4]
>>> itemgetter(*my_indices)(a_list)
('a', 'd', 'e')

Ответ 3

Индексирование по спискам может выполняться в numpy. Преобразуйте свой базовый список в массив numpy, а затем примените другой список в качестве индекса:

>>> from numpy import array
>>> array(aList)[myIndices]
array(['a', 'd', 'e'], 
  dtype='|S1')

Если вам нужно, вернитесь к списку в конце:

>>> from numpy import array
>>> a = array(aList)[myIndices]
>>> list(a)
['a', 'd', 'e']

В некоторых случаях это решение может быть более удобным, чем понимание списка.

Ответ 4

Вы можете использовать map

map(aList.__getitem__, myIndices)

или operator.itemgetter

f = operator.itemgetter(*aList)
f(myIndices)

Ответ 5

Если вам не нужен список с одновременным доступом ко всем элементам, но просто хотите использовать все элементы в списке итеративно (или передать их чему-то, что будет), более эффективно использовать выражение генератора, чем понимание списка:

(aList[i] for i in myIndices) 

Ответ 6

Я не был доволен этими решениями, поэтому я создал класс Flexlist, который просто расширяет класс list и позволяет гибкую индексацию целым, срезом или индексным списком:

class Flexlist(list):
    def __getitem__(self, keys):
        if isinstance(keys, (int, slice)): return list.__getitem__(self, keys)
        return [self[k] for k in keys]

Затем для вашего примера вы можете использовать его с помощью:

aList = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
myIndices = [0, 3, 4]
vals = aList[myIndices]

print(vals)  # ['a', 'd', 'e']