Organizar colecciones con listas

Ciencia y tecnologíaOrganizar colecciones con listas

Una variable por cada tarea funciona mientras solo tienes dos o tres. Cuando el número cambia necesitas una colección. Las listas permiten guardar varios elementos en un orden, recorrerlos y modificarlos. En esta lección crearás una agenda sencilla de textos y aprenderás a relacionar la numeración visible con las posiciones que utiliza Python.

Crear una colección ordenada

Una lista se escribe entre corchetes y separa sus elementos mediante comas. Puede contener distintos tipos pero en nuestro primer ejemplo todos serán textos. Mantener elementos del mismo tipo simplifica las operaciones y hace más claras las expectativas del programa.

tareas = ["Ordenar la mesa", "Revisar apuntes", "Preparar material"]
print(tareas)
print(len(tareas))

La primera salida muestra una representación de la lista. La segunda muestra tres porque len devuelve su longitud. Ver una lista entera resulta cómodo mientras investigas un problema. Para presentar información al usuario suele ser mejor recorrerla y mostrar cada elemento de una forma legible.

Una lista vacía se escribe []. No es lo mismo que una lista que contiene una cadena vacía, escrita [«»]. La primera tiene cero elementos y la segunda tiene uno. Esta diferencia será importante cuando validemos títulos de tareas: una entrada vacía no debería convertirse en una tarea aparentemente invisible.

Acceder por posición

El primer elemento ocupa el índice cero. El segundo ocupa el uno y así sucesivamente. Para leer el primer título escribe tareas[0]. Si la lista tiene tres elementos sus índices válidos no negativos son cero, uno y dos. Intentar acceder al índice tres provoca un IndexError.

tareas = ["Ordenar la mesa", "Revisar apuntes", "Preparar material"]
print(tareas[0])
tareas[1] = "Revisar el ejercicio de bucles"
print(tareas[1])

La asignación sustituye el elemento de esa posición. No añade un cuarto elemento ni renombra la lista. Antes de modificar una posición debes saber que existe. La longitud te ayuda a comprobarlo: un índice válido cumple 0 <= indice < len(tareas).

Python admite también índices negativos para acceder desde el final. tareas[-1] representa el último elemento cuando la lista no está vacía. Es útil en algunos contextos pero puede ocultar errores si conviertes una selección humana a índice sin validarla. Si el usuario introduce cero y restas uno terminarías accediendo al último elemento por accidente.

Añadir y quitar elementos

El método append añade un elemento al final de la lista. Modifica la lista existente y no devuelve una lista nueva. Por eso debes llamar a tareas.append(«Leer una página») sin asignar su resultado a tareas. Esa asignación sustituiría el nombre por None y perderías la referencia que estabas utilizando.

tareas = ["Ordenar la mesa"]
tareas.append("Leer una página")
retirada = tareas.pop(0)
print(retirada)
print(tareas)

pop elimina el elemento de la posición indicada y lo devuelve. En este ejemplo retirada contiene «Ordenar la mesa» y la lista conserva «Leer una página». También existe remove para quitar por valor pero falla si el valor no está y elimina solo la primera coincidencia. Elige una operación según lo que realmente conoces: la posición o el contenido.

Si dos tareas tienen el mismo título siguen siendo dos elementos distintos en posiciones diferentes. No presupongas que el texto identifica siempre un elemento de forma única. En nuestro gestor inicial usaremos la posición visible para elegir una tarea y mantendremos los duplicados como una posibilidad deliberada.

Recorrer con una numeración comprensible

Un for puede recorrer directamente los textos de una lista. Si además necesitas un número visible utiliza enumerate con start=1. Así puedes presentar una numeración habitual sin cambiar los índices internos de la lista.

tareas = ["Ordenar la mesa", "Revisar apuntes"]
for numero, titulo in enumerate(tareas, start=1):
    print(f"{numero}. {titulo}")

En cada vuelta enumerate proporciona una pareja: el número y el elemento. Los dos nombres de la izquierda reciben esos valores. El resultado muestra uno y dos como etiquetas. Para convertir una selección visible a índice tendrás que restar uno después de comprobar que se encuentra entre uno y la longitud de la lista.

No elimines elementos de la misma lista mientras la recorres sin diseñar ese comportamiento expresamente. Las posiciones se desplazan y puedes saltarte tareas. Una estrategia más sencilla consiste en seleccionar primero lo que quieres conservar y construir otra lista. En el proyecto de este curso evitaremos añadir esa dificultad hasta que controles los recorridos básicos.

Compartir una lista y copiarla

Si escribes otras = tareas ambos nombres apuntan a la misma lista. Una modificación mediante otras se verá también al consultar tareas. Esto matiza lo aprendido con números: la asignación no crea automáticamente una copia independiente de un objeto modificable.

Para una lista de textos puedes obtener una copia superficial mediante tareas.copy(). Modificar sus posiciones no modifica las posiciones de la lista original. Cuando los elementos sean a su vez diccionarios esa copia no duplicará los diccionarios internos. No necesitas resolver ahora todos los casos pero sí reconocer que copiar una colección puede requerir más atención que copiar un número.

Errores habituales

  • Pedir el elemento uno pensando que será el primero.
  • Acceder a una posición sin comprobar si la lista está vacía.
  • Guardar el resultado de append sobre la propia variable de la lista.
  • Eliminar mientras recorres y sorprenderte de que se salten elementos.
  • Confundir dos nombres del mismo objeto con dos listas independientes.

Lo que deberías recordar

  • Las listas conservan el orden de sus elementos.
  • Los índices empiezan en cero aunque la numeración visible empiece en uno.
  • append modifica la lista y pop devuelve el elemento eliminado.
  • Una asignación puede compartir un objeto modificable.

Ejercicio práctico

En la novena hoja registra una lista inicial con tres tareas. Añade una cuarta, sustituye la segunda y elimina la primera mediante su posición. Anota la lista después de cada operación. Muéstrala con enumerate empezando por uno y comprueba que quedan tres elementos.

Repite el listado con una lista vacía. El recorrido no debe mostrar tareas inexistentes. Después crea dos títulos iguales y explica cómo elegirías uno por su número visible. Conserva esos casos para el proyecto: la lista vacía y los duplicados forman parte del uso normal de una colección.

Siguiente capítulo: Describir registros con diccionarios.

Volver al índice del curso de programación desde cero.

Últimos posts

Artículo anterior

Artículos más vistos

Horóscopo diario
Menú diario