Ответ 1
>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)
Есть ли лучший способ извлечь произвольные индексы из списка в python?
Используемый мной метод:
a = range(100)
s = [a[i] for i in [5,13,25]]
Где a - массив, который я хочу нарезать, а [5,13,25] - это те элементы, которые я хочу получить. Это кажется гораздо более подробным, чем эквивалент Matlab:
a = 0:99;
s = a([6,14,26])
>>> from operator import itemgetter
>>> a = range(100)
>>> itemgetter(5,13,25)(a)
(5, 13, 25)
Если вы являетесь пользователем Matlab, но хотите использовать Python, посмотрите numpy:
In [37]: import numpy as np
In [38]: a = np.arange(100)
In [39]: s = a[[5,13,25]]
In [40]: s
Out[40]: array([ 5, 13, 25])
Вот сравнение NumPy и Matlab, и вот таблица общих команды Matlab и их эквиваленты в NumPy.
Нет "готового" способа - так, как вы это делаете, довольно просто, и вы можете его использовать. Если у вас есть много этого кода, вы можете использовать подкласс списка, который будет использовать синтаксис, как и matlabs, - это может быть сделано в нескольких строках кода, основное бремя - это то, что вам придется работать всегда используйте этот новый класс вместо встроенных списков.
class MyList(list):
def __getitem__(self, index):
if not isinstance(index, tuple):
return list.__getitem__(self, index)
return [self[i] for i in index]
И на консоли:
>>> m = MyList(i * 3 for i in range(100))
>>> m[20, 25,60]
[60, 75, 180]
Похоже, вы бы сделали:
a = list(range(99))
s = [a[5], a[13], a[25]]
похоже, что он почти идентичен версии matlab.