2012-08-07 3 views
26

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

Пример:

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

'[ALIST [я] для г в myIndices]' – Morwenn

+3

Если вы хотите перебрать элементы, я предлагаю использовать выражение генератора вместо : '(aList [i] для i в myIndices)' – hochl

ответ

52

Я не знаю ни одного способа сделать это. Но вы могли бы использовать list comprehension:

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

Определенно использовать список понимание, но здесь это функция, которая делает это (нет методов 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') 
+0

Я считаю, что это неправильный случай для используйте 'itemgetter'. –

+0

@BasicWolf Да, вы не должны использовать его, но OP попросил функцию, которая могла бы это сделать, поэтому я просто показал, что это такое. Я сделаю более ясным, что вы не должны использовать это. – jamylak

+0

Я думаю, что это также будет ограничено пределом максимального количества аргументов, которые может иметь функция. – Paddy3118

5

Индексирование по спискам может быть выполнено в 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'] 

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

1

Я не был доволен этими решениями, поэтому я создал 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'] 
+0

Это очень полезно. – mikeTronix

4

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

map(aList.__getitem__, myIndices) 

или operator.itemgetter

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

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

(aList[i] for i in myIndices) 
Смежные вопросы