Ответ 1
Я не знаю, как это сделать. Но вы можете использовать понимание :
>>> [aList[i] for i in myIndices]
В Python у меня есть список элементов aList
и список индексов myIndices
. Есть ли способ получить все сразу те элементы в aList
, имеющие в качестве индексов значения в myIndices
?
Пример:
>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> myIndices = [0, 3, 4]
>>> aList.A_FUNCTION(myIndices)
['a', 'd', 'e']
Я не знаю, как это сделать. Но вы можете использовать понимание :
>>> [aList[i] for i in myIndices]
Определенно используйте понимание списка, но вот функция, которая делает это (для этого не существует методов 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')
Индексирование по спискам может выполняться в 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']
В некоторых случаях это решение может быть более удобным, чем понимание списка.
Вы можете использовать map
map(aList.__getitem__, myIndices)
или operator.itemgetter
f = operator.itemgetter(*aList)
f(myIndices)
Если вам не нужен список с одновременным доступом ко всем элементам, но просто хотите использовать все элементы в списке итеративно (или передать их чему-то, что будет), более эффективно использовать выражение генератора, чем понимание списка:
(aList[i] for i in myIndices)
Я не был доволен этими решениями, поэтому я создал класс 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']