Necesito elegir algunos elementos de la lista dada, conociendo su índice. Digamos que me gustaría crear una nueva lista, que contiene elementos con índice 1, 2, 5, de la lista dada [-2, 1, 5, 3, 8, 5, 6]. Lo que hice es:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
¿Hay alguna forma mejor de hacerlo? algo como c = a [b]?
lambda
función.Respuestas:
Puedes usar
operator.itemgetter
:O puedes usar numpy :
Pero realmente, su solución actual está bien. Es probablemente el más lindo de todos ellos.
fuente
c = [a[i] for i in b]
está perfectamente bien. Tenga en cuenta que laitemgetter
solución no hará lo mismo si b tiene menos de 2 elementos.a[b]
funciona cuando hay una matriz numpy , es decir, la crea con una función numpy.a
Alternativas:
fuente
build-in
funciones__getitem__
no parece ser comparable, por ejemplo, ¿cómo mapear el tipo de elemento?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
. En este caso, el uso[..]
es más compacto:lambda x: type(a[x]), b
Otra solución podría ser a través de la serie pandas:
Luego puede convertir c nuevamente a una lista si desea:
fuente
Pruebas básicas y no muy extensas que comparan el tiempo de ejecución de las cinco respuestas proporcionadas:
utilizando la siguiente entrada:
el bucle simple de Python fue el más rápido con la operación lambda en segundo lugar, mapIndexValues y getIndexValues fueron bastante similares con el método numpy significativamente más lento después de convertir las listas en matrices numpy. Si los datos ya están en matrices numpy, el método numpyIndexValues con la conversión numpy.array eliminada es más rápido
fuente
numpyIndexValues
no funcionaa
, ya queb
son de tiporange
. ¿Supongo que intentas convertira
,b
anumpy.ndarrays
primero?Estoy seguro de que esto ya se ha considerado: si la cantidad de índices en b es pequeña y constante, uno podría escribir el resultado como:
O incluso más simple si los índices en sí son constantes ...
O si hay un rango consecutivo de índices ...
fuente
[a] + [b] = [a, b]
Aquí hay una manera más simple:
fuente
Mi respuesta no usa colecciones numpy o python.
Una forma trivial de encontrar elementos sería la siguiente:
Inconveniente: este método puede no funcionar para listas más grandes. Se recomienda usar numpy para listas más grandes.
fuente
a
.[a[i] for i in b]
a
tuviera otros 5?[a[i] if i<len(a) else None for i in b]
Índices estáticos y pequeña lista?
No olvide que si la lista es pequeña y los índices no cambian, como en su ejemplo, a veces lo mejor es utilizar el desempaquetado de secuencias :
El rendimiento es mucho mejor y también puede guardar una línea de código:
fuente
Tipo de forma pitónica:
fuente
O(n)
solución en unaO(n^2)
solución y casi duplicar la longitud del código. También querrá tener en cuenta que el enfoque fallará si la lista contiene objetos difusos o de igualdad parcial, por ejemplo, sia
contienefloat('nan')
, esto siempre elevará aValueError
.