2012-02-02 2 views
24

Есть ли лучший способ извлечь произвольные индексы из списка в python?Нарезка списков Python с произвольными индексами

Метод, который я в настоящее время использую:

a = range(100) 
s = [a[i] for i in [5,13,25]] 

Если это массив, который я хочу, чтобы нарезать и [5,13,25] являются элементы, которые я хочу получить. Это кажется намного более многословен, чем эквивалент Matlab:

a = 0:99; 
s = a([6,14,26]) 
+7

«Это кажется гораздо более подробным, чем Matlab». Это разные языки. Чего ты ожидал? Python ** меньше ** многословный, чем Java. –

+0

Индексы Python основаны на 0. Ваш '5' означает шестой элемент. Язык с 1 языком будет иметь «6». Почему Matlab нуждается в «4»? Он начинается с -1? –

+0

Этот способ на самом деле очень читабельен, и мне это нравится. – becko

ответ

31
>>> from operator import itemgetter 
>>> a = range(100) 
>>> itemgetter(5,13,25)(a) 
(5, 13, 25) 
+3

Обратите внимание на это условие края, если вы используете список в качестве индексов: indexes = [1,]; itemgetter (* indexes) (a) ----> возвращает целое число, а не кортеж – rrauenza

+0

Спасибо! С этой функцией, это должен быть первый раз, когда я столкнулся с реальной необходимостью для распаковщика *. –

+2

Ничего страшного, я бы хотел, чтобы это было поведением по умолчанию - если он пойдет наперебой и скажет мне, что он не может принимать индексы кортежей, он может попробовать и сначала использовать кортеж для чего-то. Я пришел сюда после того, как привык к идее обращаться к узлам кластера IPython аналогичным образом. –

8

Там нет «готовых» путь - путь вы делаете это довольно бесхитростный, и вы можете использовать его. Если у вас есть много этого кода, вы можете использовать подкласс списка, который будет использовать синтаксис так же, как 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] 
0

Похоже, что вы могли бы сделать:

a = list(range(99)) 
    s = [a[5], a[13], a[25]] 

это, кажется, почти идентична версии Matlab.

Смежные вопросы