Tengo la siguiente lista de Python (también puede ser una tupla):
myList = ['foo', 'bar', 'baz', 'quux']
puedo decir
>>> myList[0:3]
['foo', 'bar', 'baz']
>>> myList[::2]
['foo', 'baz']
>>> myList[1::2]
['bar', 'quux']
¿Cómo selecciono explícitamente elementos cuyos índices no tienen patrones específicos? Por ejemplo, quiero seleccionar [0,2,3]. O de una lista muy grande de 1000 elementos, quiero seleccionar [87, 342, 217, 998, 500]. ¿Existe alguna sintaxis de Python que haga eso? Algo que se parezca a:
>>> myBigList[87, 342, 217, 998, 500]

Respuestas:
Comparé las respuestas con python 2.5.2:
19.7 usec:
[ myBigList[i] for i in [87, 342, 217, 998, 500] ]20.6 usec:
map(myBigList.__getitem__, (87, 342, 217, 998, 500))22.7 usec:
itemgetter(87, 342, 217, 998, 500)(myBigList)24.6 usec:
list( myBigList[i] for i in [87, 342, 217, 998, 500] )Tenga en cuenta que en Python 3, el primero se cambió para que sea el mismo que el cuarto.
Otra opción sería comenzar con una
numpy.arrayque permita indexar a través de una lista o unanumpy.array:El
tupleno funciona de la misma manera que los cortes.fuente
[myBigList[i] for i in [87, 342, 217, 998, 500]], pero me gusta más este enfoque.from operator import itemgetteren la parte de inicialización depython -mtimeit.myBigList[(87, 342, 217, 998, 500)]no funciona cuandomyBigListes una pitón normallist? Cuando lo intento, lo consigoTypeError: list indices must be integers or slices, not tuple. Eso sería mucho más fácil que escribir la comprensión: ¿hay algún problema de diseño / implementación del lenguaje involucrado?listsen Python solo acepta enteros o porciones. Pasar un número entero asegura que solo se recupere un elemento de una lista existente. Pasar un segmento asegura que se recupere una parte, pero pasar una tupla es como pasar un tipo de datos (tuple) como argumento a otro tipo de datos (list) que es sintácticamente incorrecto.¿Qué pasa con esto?
fuente
operatormódulo!No está integrado, pero puede crear una subclase de lista que tome tuplas como "índices" si lo desea:
impresión
fuente
Quizás una lista de comprensión esté en orden:
Produce:
¿Es esto lo que estás buscando?
fuente
También puede crear su propia
Listclase que admita tuplas como argumentos__getitem__si desea poder hacerlomyList[(2,2,1,3)].fuente
operator.len(myList)overmyList.__len__().Solo quiero señalar que incluso la sintaxis de itemgetter se ve muy bien, pero es un poco lento cuando se realiza en una lista grande.
Itemgetter tomó 1.065209062149279
Varios cortes tomaron 0.6225321444745759
fuente
myList = np.array(range(1000000))contrario, obtendrá un error.Otra posible solución:
fuente
como a menudo cuando tienes una matriz numpy booleana como
mask[mylist[i] for i in np.arange(len(mask), dtype=int)[mask]]Una lambda que funciona para cualquier secuencia o np.array:
subseq = lambda myseq, mask : [myseq[i] for i in np.arange(len(mask), dtype=int)[mask]]newseq = subseq(myseq, mask)fuente