una tuplas por metodos llenar listas lista elementos diccionarios diccionario comprensión agregar python tuples itertools

python - por - Lista de comprensión para extraer múltiples campos de la lista de tuplas



llenar una lista en python (4)

Tengo una lista de tuplas

servers = [(''server1'', 80 , 1, 2), (''server2'', 443, 3, 4)]

Quiero crear una nueva lista que solo tenga los dos primeros campos como en:

[(''server1'', 80), (''server2'', 443)]

pero no puedo ver cómo elaborar una lista de comprensión para más de un elemento.

hosts = [x[0] for x in servers] # this works to give me [''server1'', server2''] hostswithports = [x[0], x[1] for x in servers] # this does not work

Prefiero aprender la forma pitónica frente a usar un bucle. ¿Qué estoy haciendo mal?


Lo que estabas haciendo era casi correcto. Estabas intentando traducir cada tupla de tu lista a una nueva tupla. Pero se te olvidó declarar la tupla. Eso es lo que hacen los paréntesis:

hosts = [(x[0], x[1]) for x in servers]


Podrías usar itemgetter :

from operator import itemgetter servers = [(''server1'', 80 , 1, 2), (''server2'', 443, 3, 4)] result = list(map(itemgetter(0, 1), servers)) print(result)

Salida

[(''server1'', 80), (''server2'', 443)]

Una alternativa más legible es la siguiente:

from operator import itemgetter get_server_and_port = itemgetter(0, 1) servers = [(''server1'', 80, 1, 2), (''server2'', 443, 3, 4)] result = [get_server_and_port(e) for e in servers] print(result) # [(''server1'', 80), (''server2'', 443)]


Puede utilizar el desempaquetado iterable extendido .

>>> servers = [(''server1'', 80 , 1, 2), (''server2'', 443, 3, 4)] >>> [(server, port) for server, port, *_ in servers] [(''server1'', 80), (''server2'', 443)]

Usar _ como un nombre de marcador de posición desechable es una convención común.


Uso de la división básica, que tiene la ventaja de no fallar si alguno de los elementos de su lista no tiene el número esperado de subelementos.

[el[:2] for el in servers]

[(''server1'', 80), (''server2'', 443)]