HOWTO · Python
Crear una lista de tuplas a partir de varias listas y tuplas en Python
Aprende a crear una lista de tuplas a partir de varias listas y tuplas en Python
En esta página
Usa list(zip(values_a, values_b, ...)) para emparejar los valores en la misma posición y materializar el resultado como una lista de tuplas. La función integrada zip() acepta listas, tuplas y otros iterables, por lo que suele ser la forma más clara de combinar valores correspondientes en Python.
Este artículo usa Python 3.14.7 y cubre entradas de igual longitud, el comportamiento predeterminado con longitudes distintas, la validación estricta y cómo conservar cada fila cuando una entrada es más larga.
Qué devuelve zip()
Cada elemento producido por zip() es una tupla que contiene un valor de cada entrada. El objeto zip es perezoso: produce tuplas al iterarlo en lugar de guardar todo el resultado. Envuélvelo en list() cuando necesites una lista de tuplas materializada que puedas imprimir, indexar o reutilizar.
Las entradas pueden mezclar listas y tuplas. El emparejamiento es posicional: se combinan primero los primeros valores, después los segundos, y así sucesivamente. La longitud de la tupla equivale al número de iterables de entrada.
Crear una lista de tuplas con entradas de igual longitud
El siguiente ejemplo combina una lista de números con una tupla de letras. list(zip(...)) consume el iterador perezoso y devuelve la lista de tuplas solicitada.
values = list(zip([1, 2, 3], ("a", "b", "c")))
print(values)
Salida:
[(1, 'a'), (2, 'b'), (3, 'c')]
Con entradas de igual longitud, el resultado tiene una tupla por posición. La operación no requiere paquetes de terceros y la lista de salida usa espacio proporcional al número de tuplas producidas. Si solo necesitas iterar una vez, conserva el objeto zip perezoso en vez de materializarlo.
Gestionar entradas de distinta longitud
De forma predeterminada, zip() se detiene cuando se agota la entrada más corta. Esto resulta útil si deben ignorarse valores adicionales, pero puede ocultar datos faltantes cuando todas las entradas deberían tener la misma longitud. Usa strict=True cuando las longitudes iguales sean una invariante. Python genera entonces ValueError al detectar que una entrada es más corta o más larga.
try:
list(zip([1, 2, 3], ("a", "b"), strict=True))
except ValueError as error:
print(type(error).__name__, str(error))
Salida:
ValueError zip() argument 2 is shorter than argument 1
La opción strict=True está disponible desde Python 3.10. Es adecuada para registros que deben permanecer alineados; gestiona el ValueError o valida las entradas antes de continuar.
Conservar cada fila con itertools.zip_longest()
Cuando el resultado debe incluir las posiciones de la entrada más larga, usa itertools.zip_longest() en lugar del zip() predeterminado. Rellena las posiciones ausentes con None, salvo que proporciones un fillvalue. Elige un marcador que no pueda confundirse con un valor real.
Por ejemplo, list(itertools.zip_longest(first, second, fillvalue="missing")) conserva todas las posiciones y marca el valor ausente como "missing". Es el comportamiento adecuado cuando truncar en la entrada más corta descartaría una fila.
Crear la lista manualmente cuando necesitas control explícito
El método manual con índices es útil cuando las entradas deben validarse específicamente como objetos list o tuple, o cuando las reglas personalizadas deben estar junto a la lógica de emparejamiento. El fallback ejecutable convert = lambda *args: [] if not all(isinstance(value, (list, tuple)) for value in args) else [tuple(value[index] for value in args) for index in range(min((len(value) for value in args), default=0))] conserva la validación y se detiene en la entrada más corta. Para los cuatro valores de ejemplo devuelve [(1.1, 'H', True, 100), (2.2, 'E', False, 200), (3.3, 'L', False, 300)].
La función rechaza un argumento cuyo tipo no sea list ni tuple y después se detiene en la entrada más corta. Con m como longitud mínima y n como número de entradas, tarda O(m * n) y usa O(m * n) de espacio para el resultado materializado.
Elegir el método adecuado
Usa list(zip(...)) para el emparejamiento posicional habitual y un resultado materializado. Usa zip() perezoso cuando baste una iteración. Usa strict=True si las longitudes distintas indican datos no válidos, y itertools.zip_longest() con un valor de relleno explícito cuando no deba descartarse ninguna fila. El método manual es un fallback para reglas de validación o indexación personalizadas.