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)]