HOWTO · Python
Crear lista de listas en Python
Este tutorial demuestra cómo crear una lista que contenga otras listas en Python
En esta página
Una lista de Python puede contener otras listas como elementos. Esta estructura permite mantener juntas secuencias relacionadas, como filas de valores, grupos de registros o datos anidados. Una lista anidada rectangular de números puede representar una matriz, pero las listas anidadas no tienen que ser rectangulares: cada lista interna puede tener una longitud distinta.
Los ejemplos siguientes muestran tres formas de construir esta estructura y, después, cómo consultar y modificar sus valores. Elige el método que mejor se adapte a si ya tienes las listas internas, necesitas una cuadrícula regular o vas a generar los valores paso a paso.
Qué representa una lista de listas
Una lista externa almacena referencias a sus elementos. Cuando un elemento es a su vez una lista, puedes usar la lista externa para agrupar esas listas internas. Por ejemplo, una lista de clase podría almacenarse con una lista por curso, o una cuadrícula numérica, con una lista por fila.
Una lista anidada no es automáticamente una matriz. Es útil interpretarla como una matriz cuando todas las filas tienen el mismo número de columnas y los valores forman una disposición rectangular. Python permite que las filas tengan distintas longitudes. Esto puede resultar práctico para agrupar datos, pero exige cuidado al recorrerlos por columnas.
Crear una lista de listas a partir de listas existentes
Si ya tienes listas internas, colócalas en un literal de lista externa. Para añadir más adelante otra lista existente, llama al método de lista append() sobre la lista externa. Añade el argumento como un único elemento al final; no combina los valores de esa lista con los elementos de la lista externa.
Ejecuta este ejemplo. El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés:
first = ["Ada", "Grace"]
second = ["Linus", "Guido"]
people_by_group = [first, second]
third = ["Barbara", "Margaret"]
people_by_group.append(third)
print(people_by_group)
La lista externa contiene tres listas internas. Como las listas originales son objetos mutables, cualquier cambio posterior en first también se verá en people_by_group[0]: ambos nombres hacen referencia a la misma lista.
Crear filas independientes con una comprensión de listas anidada
Para una cuadrícula fija, una comprensión de listas anidada crea cada fila por separado. La comprensión externa se ejecuta una vez por fila. Su expresión es una comprensión interna que crea los valores de esa fila.
Ejecuta este ejemplo. El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés:
rows, columns = 3, 4
grid = [[0 for _ in range(columns)] for _ in range(rows)]
print(grid)
En cada iteración de la comprensión externa se evalúa una lista interna nueva, por lo que las filas pueden modificarse de manera independiente. Usa este patrón cuando necesites una cuadrícula mutable con el mismo valor inicial en todas las celdas. Sustituye 0 por otro valor o expresión inicial, según necesites.
Crear una lista de listas con bucles anidados
Los bucles anidados son útiles cuando cada valor depende de su fila o columna, o cuando quieres hacer explícitos los pasos de construcción. Empieza con una lista externa, crea una fila cada vez, rellénala en el bucle interno y, después, añade la fila completa.
Ejecuta este ejemplo. El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés:
rows, columns = 3, 4
grid = []
for row_index in range(rows):
row = []
for column_index in range(columns):
row.append(row_index * columns + column_index)
grid.append(row)
print(grid)
Aquí, cada celda recibe un valor calculado a partir de su posición. Llamar a append() sobre row añade un valor; llamarlo sobre grid añade la fila completa. Este método también sirve cuando el número o el contenido de los valores se decide durante la iteración.
Acceder a elementos anidados y actualizarlos
Usa un índice para la lista externa y otro para la lista interna seleccionada: list_of_lists[row_index][column_index]. Python indexa desde cero, así que el primer valor de la primera fila está en [0][0]. Para sustituir un elemento, asigna un valor a esa misma expresión.
Ejecuta este ejemplo. El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés:
grid = [[2, 4, 6], [8, 10, 12]]
print(grid[1][0])
grid[0][2] = 7
print(grid)
El primer índice selecciona una fila y el segundo, un elemento de esa fila. El índice de fila debe corresponder a una lista interna existente, y el índice de columna debe estar disponible en la fila seleccionada. Si las filas tienen distintas longitudes, comprueba la longitud de la fila elegida antes de usar un índice de columna: una columna disponible en una fila podría no existir en otra.
Elegir un método de construcción y evitar filas compartidas
Usa un literal de lista cuando ya conozcas las sublistas. Para crear una cuadrícula regular con filas independientes, usa una comprensión de listas anidada. Usa bucles anidados cuando los valores se calculen paso a paso o la construcción requiera lógica adicional. Estos métodos crean una lista interna nueva para cada fila.
Un atajo tentador para crear una cuadrícula es [[0] * columns] * rows. Este método repite las referencias a una sola lista interna en vez de crear una lista independiente por fila. Por eso, si cambias una celda de una fila, el mismo cambio también se verá en esa posición de todas las demás filas. Para una cuadrícula mutable, usa la comprensión anidada mostrada antes o crea cada fila por separado en un bucle.
Las listas anidadas también pueden tener filas de distintas longitudes si eso refleja los datos. Al procesar una estructura así, recorre los valores de cada fila sin dar por sentado que todas tienen el mismo número de columnas. De este modo, la construcción y el acceso posterior se ajustan a la forma de los datos.