Forma compacta de asignar valores por medio de la lista de sectores en Python

Tengo la siguiente lista

bar = ['a','b','c','x','y','z'] 

Lo que quiero hacer es asignar los valores 1º, 4º y 5º de la bar en v1,v2,v3 , hay una forma más compacta de hacerlo que esta:

 v1, v2, v3 = [bar[0], bar[3], bar[4]] 

Porque en Perl puedes hacer algo como esto:

 my($v1, $v2, $v3) = @bar[0,3,4]; 

Puede utilizar operator.itemgetter :

 >>> from operator import itemgetter >>> bar = ['a','b','c','x','y','z'] >>> itemgetter(0, 3, 4)(bar) ('a', 'x', 'y') 

Entonces para tu ejemplo harías lo siguiente:

 >>> v1, v2, v3 = itemgetter(0, 3, 4)(bar) 

Suponiendo que sus índices no sean ni dynamics ni demasiado grandes, aceptaría

 bar = ['a','b','c','x','y','z'] v1, _, _, v2, v3, _ = bar 

Como quieres compacidad, puedes hacerlo de la siguiente manera:

 indices = (0,3,4) v1, v2, v3 = [bar[i] for i in indices] >>> print v1,v2,v3 #or print(v1,v2,v3) for python 3.x axy 

En numpy , puede indexar una matriz con otra matriz que contiene índices. Esto permite una syntax muy compacta, exactamente como usted quiere:

 In [1]: import numpy as np In [2]: bar = np.array(['a','b','c','x','y','z']) In [3]: v1, v2, v3 = bar[[0, 3, 4]] In [4]: print v1, v2, v3 axy 

El uso de numpy probablemente sea excesivo para su caso simple. Solo lo menciono para completar, en caso de que necesite hacer lo mismo con grandes cantidades de datos.

Otro método más:

 from itertools import compress bar = ['a','b','c','x','y','z'] v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1, 0)) 

Además, puede ignorar la longitud de la lista y omitir ceros al final de los selectores:

 v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1,)) 

https://docs.python.org/2/library/itertools.html#itertools.compress