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.array
que permita indexar a través de una lista o unanumpy.array
:El
tuple
no 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 itemgetter
en la parte de inicialización depython -mtimeit
.myBigList[(87, 342, 217, 998, 500)]
no funciona cuandomyBigList
es 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?lists
en 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
operator
mó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
List
clase 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