Me pregunto cuál es la mejor manera de extraer el primer elemento de cada sublista en una lista de listas y agregarlo a una nueva lista. Entonces si tengo:
lst = [[a,b,c], [1,2,3], [x,y,z]]
y quiero sacar a
, 1
y x
y crear una lista separada de aquellos.
Lo intenté:
lst2.append(x[0] for x in lst)
Respuestas:
Usando la comprensión de la lista :
fuente
Puedes usar zip:
O, Python 3 donde
zip
no produce una lista:O,
O (mi favorito) usa numpy:
fuente
list
primero o úsalonext
. GraciasTuve el mismo problema y sentí curiosidad por el rendimiento de cada solución.
Aquí está el
%timeit
:El primer numpy-way, transformando la matriz:
Totalmente nativo usando la comprensión de la lista (como lo explica @alecxe):
Otra forma nativa de usar
zip
(como explica @dawg):Segunda forma numpy. También explicado por @dawg:
Sorprendentemente (bueno, al menos para mí) la forma nativa que usa la comprensión de listas es la más rápida y aproximadamente 10 veces más rápida que la forma numpy. Ejecutar las dos formas de numpy sin el final
list
ahorra aproximadamente un µs que todavía está en la diferencia de 10x.Tenga en cuenta que, cuando rodeé cada fragmento de código con una llamada a
len
, para asegurarme de que los Generadores funcionen hasta el final, el tiempo se mantuvo igual.fuente
Python incluye una función llamada itemgetter para devolver el elemento en un índice específico en una lista:
Pase la función itemgetter () al índice del elemento que desea recuperar. Para recuperar el primer elemento, usaría itemgetter (0). Lo importante a entender es que itemgetter (0) en sí mismo devuelve una función. Si pasa una lista a esa función, obtendrá el elemento específico:
Esto es útil cuando lo combina con map (), que toma una función como primer argumento, y una lista (o cualquier otro iterable) como segundo argumento. Devuelve el resultado de llamar a la función en cada objeto en el iterable:
Tenga en cuenta que map () devuelve un generador, por lo que el resultado se pasa a list () para obtener una lista real. En resumen, su tarea podría hacerse así:
Este es un método alternativo al uso de una comprensión de lista, y qué método elegir depende en gran medida del contexto, la legibilidad y la preferencia.
Más información: https://docs.python.org/3/library/operator.html#operator.itemgetter
fuente
Tu código es casi correcto. El único problema es el uso de la comprensión de la lista.
Si usa like: (x [0] para x en lst), devuelve un objeto generador. Si usa like: [x [0] para x en lst], devuelve una lista.
Cuando agrega el resultado de la comprensión de la lista a una lista, el resultado de la comprensión de la lista es el elemento único de la lista.
lst2 = [['' a ', 1,' x ']]
lst2 [0] = ['a', 1, 'x']
Avísame si soy incorrecto.
fuente
Salida:
['a', 1, 'x']
fuente
Dijiste que tienes una lista existente. Entonces iré con eso.
En este momento está agregando el objeto generador a su segunda lista.
Pero probablemente quieras que sea una lista de los primeros elementos
Ahora agregamos la lista de primeros elementos a la lista existente. Si desea agregar los elementos por sí mismos, no una lista de ellos, a los existentes, usaría list.extend. En ese caso, no tenemos que preocuparnos de agregar un generador, porque extender lo usará para agregar cada elemento que obtenga de allí, para extender la lista actual.
o
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
fuente
append
en la pregunta está causando confusión. Parece que simplemente quiere la parte de comprensión de la lista de su solución.