Python básico

Listas y diccionarios

Lección 7 de 8 · 18 min

Guardar muchas cosas en una sola variable

Una variable guarda un dato. Pero un negocio no tiene un precio: tiene una lista de precios, un catálogo de productos, un registro de ventas.

Python tiene dos estructuras para eso, y con ellas resuelves casi todo: listas y diccionarios.

La lista: cosas en orden

Va entre corchetes, con los elementos separados por comas. Mantiene el orden en que los pusiste y admite repetidos.

Crear y leer una lista
productos = ["Teclado", "Mouse", "Monitor", "Cable"]

print(productos[0])    # el primero
print(productos[2])    # el tercero
print(productos[-1])   # el ULTIMO
print(len(productos))  # cuantos hay
Resultado
Teclado
Monitor
Cable
4

El primer elemento es el 0, no el 1. Cuesta al principio y es la causa del error más común de todos: IndexError: list index out of range, que sale al pedir productos[4] en una lista de cuatro -porque sus posiciones son 0, 1, 2 y 3-.

El atajo que sí ayuda: [-1] es el último, [-2] el penúltimo. No hay que saber cuántos hay.

Lo que se le hace a una lista

Agregar

productos.append("Webcam") lo pone al final.

productos.insert(0, "Webcam") lo pone en una posición concreta.

Quitar

productos.remove("Mouse") quita por valor.

productos.pop() saca el último y te lo devuelve.

Ordenar

productos.sort() los ordena alfabéticamente y modifica la lista original.

sorted(productos) devuelve una copia ordenada y deja la original quieta.

Buscar

"Mouse" in productos devuelve True o False.

Es la forma correcta de comprobar antes de quitar algo: si haces remove() de lo que no está, el programa se cae.

El diccionario: cosas con nombre

En una lista buscas por posición, y "el elemento 3" no dice nada. En un diccionario cada dato tiene una clave que lo nombra. Va entre llaves, con clave: valor.

Un producto completo
producto = {
    "nombre": "Teclado mecanico",
    "precio": 189000,
    "stock": 12,
    "activo": True
}

print(producto["nombre"])
print(producto["precio"])

# Cambiar un valor
producto["stock"] = 8

# Agregar una clave nueva
producto["categoria"] = "Perifericos"

print(producto["stock"], producto["categoria"])
Resultado
Teclado mecanico
189000
8 Perifericos

producto["precio"] se entiende solo; producto[1] obliga a ir a mirar qué había en esa posición. Cuando cada dato significa algo distinto, usa diccionario. Cuando son muchos datos del mismo tipo, usa lista.

Pedir una clave que no existe rompe el programa (KeyError). Para leer sin riesgo está .get(), que devuelve None -o lo que le indiques- en vez de fallar:

producto.get("descuento", 0) → devuelve 0 si esa clave no está.

Las dos juntas: una tabla de datos

Aquí es donde esto se vuelve poderoso. Una lista de diccionarios es exactamente una tabla: cada diccionario es una fila y cada clave es una columna. Así se representa una hoja de Excel en Python.

Ventas del día
ventas = [
    {"producto": "Teclado", "cantidad": 2, "valor": 189000},
    {"producto": "Mouse",   "cantidad": 5, "valor":  45000},
    {"producto": "Monitor", "cantidad": 1, "valor": 890000},
]

total = 0
for venta in ventas:
    subtotal = venta["cantidad"] * venta["valor"]
    total += subtotal
    print(venta["producto"], "->", subtotal)

print("-" * 30)
print("TOTAL DEL DIA:", total)
Resultado
Teclado -> 378000
Mouse -> 225000
Monitor -> 890000
------------------------------
TOTAL DEL DIA: 1493000

La trampa que destroza datos sin avisar: asignar una lista a otra variable no la copia. Las dos variables apuntan al mismo dato, así que modificar una cambia la otra.

copia = originalmal, es la misma lista.
copia = original.copy() → bien, es una lista nueva.

Es el mismo principio de "trabaja siempre sobre una copia", pero dentro del programa: si crees que estás tocando la copia y estás tocando el original, pierdes los datos y nada te lo dice.

¿Lista o diccionario?

Decide cuál usarías y haz clic para comprobarlo.

Empareja cada operación con lo que hace

Arrastra cada método a su definición, o toca uno y luego su espacio. Al terminar pulsa Comprobar.

  1. Agrega un elemento al final de una lista.
  2. Quita de la lista el elemento que tenga ese valor. Si no está, el programa se cae.
  3. Ordena la lista modificando la original. La versión que devuelve una copia es sorted().
  4. Devuelve cuántos elementos hay.
  5. Lee una clave de un diccionario sin romperse si no existe: devuelve un valor por defecto.
  6. Entrega clave y valor a la vez para recorrer un diccionario con un for.

Preguntas que siempre salen

¿Cómo recorro un diccionario?

Con .items(), que entrega la clave y el valor a la vez:

for clave, valor in producto.items():

También existen .keys() y .values() si solo necesitas una de las dos partes.

¿Puede una lista tener datos de tipos distintos?

Sí, Python lo permite: [1, "hola", True] es válido. Pero casi siempre es señal de un diseño confuso. Una lista suele guardar cosas del mismo tipo.

¿Y las tuplas, que aparecen en todos lados?

Son como listas pero no se pueden modificar, y van entre paréntesis: (3, 7). Se usan para datos que no deben cambiar, como unas coordenadas. Para este curso no las necesitas.

¿Cómo ordeno una lista de diccionarios?

Indicando por qué clave ordenar:

sorted(ventas, key=lambda v: v["valor"], reverse=True)

Se ve raro la primera vez. Es tema del curso intermedio, pero se copia y funciona.

Compruébalo tú mismo

En datos = ["a", "b", "c"], ¿qué devuelve datos[-1]?

¿Qué hace copia = original con una lista?

¿Cómo se representa una tabla de datos en Python?

Lo que sigue

Ya tienes todas las piezas. En la última lección vas a agruparlas en funciones y construir un programa completo que le sirva de verdad a un negocio.

Siguiente: Funciones y proyecto final

Continuar ← Ciclos: repetir sin copiar y pegar