2012-02-02 10 views
24

¿Existe alguna forma mejor de extraer índices arbitrarios de una lista en python?División de listas de Python con índices arbitrarios

El método que utilizo actualmente es:

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

donde A es la matriz quiero cortar, y [5,13,25] son ​​los elementos que quiero conseguir. Parece mucho más detallado que el equivalente de Matlab:

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

"Parece mucho más detallado que el Matlab". Son idiomas diferentes. ¿Que esperabas? Python es ** menos ** detallado que Java. –

+0

Los índices de Python están basados ​​en 0. Tu '5' significa el sexto elemento. Un lenguaje basado en 1 tendría un '6 'allí. ¿Cómo es que Matlab necesita '4'? ¿Comienza desde -1? –

+0

De esta manera es realmente muy legible, y me gusta. – becko

Respuesta

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

Tenga en cuenta esta condición de borde si utiliza una lista como los índices: indexes = [1,]; itemgetter (* índices) (a) ----> devuelve un número entero, no una tupla – rrauenza

+0

¡Gracias! Con esta función, debe ser la primera vez que encuentro una necesidad real de operador desempaquetar *. –

+2

Bien, desearía que esto fuera un comportamiento predeterminado: si va a tomarse la molestia y me dice que no puede aceptar índices de tuplas, podría intentar usar la tupla primero. Vine aquí después de acostumbrarme a la idea de abordar los nodos del clúster IPython de una manera similar. –

8

No hay manera "ya hecho" - la forma en que lo hace es bastante ingenua, y usted podría utilizarlo. Si tiene mucho de eso a través de su código, es posible que desee utilizar una subclase de lista que usaría una sintaxis como matlabs; se puede hacer en un código de algunas líneas, la mayor carga es que tendría que el trabajo siempre usa esta nueva clase en lugar de las listas incorporadas.

class MyList(list): 
    def __getitem__(self, index): 
     if not isinstance(index, tuple): 
      return list.__getitem__(self, index) 
     return [self[i] for i in index] 

Y en la consola:

>>> m = MyList(i * 3 for i in range(100)) 
>>> m[20, 25,60] 
[60, 75, 180] 
0

Parece igual que lo haría:

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

esto parece ser casi idéntica a la versión de MATLAB.

Cuestiones relacionadas