Estructuras de Datos
## Objetivos de Aprendizaje
- Dominar listas, tuplas, conjuntos y diccionarios
- Entender cuándo usar cada estructura de datos
- Aprender operaciones y métodos comunes
## Listas
### Crear Listas
```python
vacia = []
numeros = [1, 2, 3, 4, 5]
mixta = [1, "hola", 3.14, True]
anidada = [[1, 2], [3, 4]]
```
### Acceder a Elementos
```python
frutas = ["manzana", "plátano", "cereza"]
print(frutas[0]) # manzana
print(frutas[-1]) # cereza
print(frutas[1:3]) # ['plátano', 'cereza']
print(frutas[:2]) # ['manzana', 'plátano']
print(frutas[1:]) # ['plátano', 'cereza']
```
### Modificar Listas
```python
frutas = ["manzana", "plátano", "cereza"]
# Añadir
frutas.append("dátil") # Al final
frutas.insert(1, "albaricoque") # En índice
frutas.extend(["mora", "higo"]) # Añadir varios
# Eliminar
frutas.remove("plátano") # Eliminar por valor
popped = frutas.pop() # Eliminar y devolver último
popped = frutas.pop(0) # Eliminar y devolver en índice
del frutas[0] # Eliminar en índice
frutas.clear() # Eliminar todos
# Modificar
frutas[0] = "aguacate" # Cambiar en índice
frutas[1:3] = ["arándano", "melón"] # Reemplazar segmento
```
### Métodos de Lista
```python
numeros = [3, 1, 4, 1, 5, 9, 2, 6]
numeros.sort() # Ordenar en lugar
sorted(numeros) # Devolver nueva lista ordenada
numeros.reverse() # Invertir en lugar
numeros.index(4) # Índice de primera aparición
numeros.count(1) # Contar ocurrencias
numeros.copy() # Copia superficial
```
### Funciones de Lista
```python
numeros = [3, 1, 4, 1, 5, 9, 2, 6]
len(numeros) # 8
min(numeros) # 1
max(numeros) # 9
sum(numeros) # 31
any(numeros) # True (truthy si alguno)
all(numeros) # True (truthy si todos)
```
### List Comprehensions
```python
cuadrados = [x ** 2 for x in range(5)]
# [0, 1, 4, 9, 16]
pares = [x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]
matriz = [[i * j for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
```
## Tuplas
### Crear Tuplas
```python
vacia = ()
unico = (42,) # ¡Nota la coma!
punto = (3, 4)
mixta = (1, "hola", 3.14)
anidada = ((1, 2), (3, 4))
```
### Indexación de Tuplas
```python
punto = (3, 4, 5)
print(punto[0]) # 3
print(punto[-1]) # 5
print(punto[1:3]) # (4, 5)
```
### Métodos de Tupla
```python
punto = (3, 4, 3, 5, 3)
punto.count(3) # 3 (conteo de 3)
punto.index(4) # 1 (primer índice de 4)
```
### Por qué Tuplas?
- Inmutables (no se pueden modificar)
- Más rápidas que las listas
- Pueden usarse como claves de diccionario
- Protegen integridad de datos
```python
# Inmutable - no puedes hacer esto:
# punto[0] = 10 # ¡TypeError!
# Usar como claves de diccionario
ubicaciones = {
(40.7128, 74.0060): "Nueva York",
(51.5074, 0.1278): "Londres",
}
```
### Desempaquetado de Tuplas
```python
x, y, z = (1, 2, 3)
print(x, y, z) # 1 2 3
# Desempaquetado extendido
primero, *medio, ultimo = [1, 2, 3, 4, 5]
print(primero) # 1
print(medio) # [2, 3, 4]
print(ultimo) # 5
```
## Conjuntos
### Crear Conjuntos
```python
vacio = set() # ¡No {} - eso es un dict!
numeros = {1, 2, 3, 4, 5}
mixto = {1, "hola", 3.14}
desde_lista = set([1, 2, 2, 3, 3]) # {1, 2, 3}
```
### Operaciones de Conjunto
```python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# Unión
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b)) # Same
# Intersección
print(a & b) # {3, 4}
print(a.intersection(b)) # Same
# Diferencia
print(a - b) # {1, 2}
print(a.difference(b)) # Same
# Diferencia Simétrica
print(a ^ b) # {1, 2, 5, 6}
print(a.symmetric_difference(b)) # Same
```
### Métodos de Conjunto
```python
s = {1, 2, 3}
s.add(4) # Añadir un elemento
s.update([5, 6]) # Añadir varios
s.remove(3) # Eliminar (lanza error si no existe)
s.discard(10) # Eliminar (sin error si no existe)
s.pop() # Eliminar y devolver elemento arbitrario
s.clear() # Eliminar todos
```
### Comparaciones de Conjuntos
```python
a = {1, 2, 3}
b = {1, 2}
c = {1, 2, 3, 4}
print(a.issubset(b)) # False
print(b.issubset(a)) # True (b es subconjunto de a)
print(a.issuperset(b)) # True (a es superconjunto de b)
print(a.isdisjoint(b)) # False (comparten elementos)
```
### Cuándo Usar Conjuntos
- Eliminar duplicados
- Pruebas de membresía (rápido)
- Operaciones matemáticas de conjuntos
- Encontrar elementos únicos
```python
# Eliminar duplicados
elementos = [1, 2, 2, 3, 3, 3]
unicos = set(elementos)
print(list(unicos)) # [1, 2, 3]
# Membresía rápida
permitidos = {"admin", "editor", "visor"}
if "admin" in permitidos:
print("Acceso concedido")
```
## Diccionarios
### Crear Diccionarios
```python
vacio = {}
persona = {"Nombre": "Ana", "edad": 25}
dict(edad=25, nombre="Bob") # Desde argumentos de palabra clave
dict([("a", 1), ("b", 2)]) # Desde lista de tuplas
{**{"a": 1}, **{"b": 2}} # Desde fusión
```
### Acceso a Diccionario
```python
persona = {"Nombre": "Ana", "edad": 25, "ciudad": "Madrid"}
print(persona["Nombre"]) # Ana
print(persona.get("Nombre")) # Ana
print(persona.get("trabajo", "Desconocido")) # Desconocido (por defecto)
```
### Modificar Diccionarios
```python
persona = {"Nombre": "Ana", "edad": 25}
# Añadir/Actualizar
persona["ciudad"] = "Madrid"
persona.update({"edad": 26, "trabajo": "Ingeniera"})
# Eliminar
del persona["trabajo"]
popped = persona.pop("edad")
persona.clear()
```
### Métodos de Diccionario
```python
persona = {"Nombre": "Ana", "edad": 25, "ciudad": "Madrid"}
persona.keys() # dict_keys(['Nombre', 'edad', 'ciudad'])
persona.values() # dict_values(['Ana', 25, 'Madrid'])
persona.items() # dict_items([('Nombre', 'Ana'), ...])
persona.setdefault("país", "España") # Establecer si no existe
```
### Vistas de Diccionario
```python
persona = {"Nombre": "Ana", "edad": 25}
# Las vistas reflejan cambios
claves = persona.keys()
persona["ciudad"] = "Madrid"
print(list(claves)) # ['Nombre', 'edad', 'ciudad']
```
### Iteración de Diccionario
```python
persona = {"Nombre": "Ana", "edad": 25, "ciudad": "Madrid"}
# Claves
for clave in persona:
print(clave)
# Pares clave-valor
for clave, valor in persona.items():
print(f"{clave}: {valor}")
```
### Dictionary Comprehensions
```python
cuadrados = {x: x ** 2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
palabras = ["manzana", "plátano", "cereza"]
longitudes = {palabra: len(palabra) for palabra in palabras}
# {'manzana': 8, 'plátano': 7, 'cereza': 6}
```
## Elegir Estructuras de Datos
| Estructura | Ordenada | Mutable | Duplicados | Caso de Uso |
|-----------|---------|---------|------------|------------|
| Lista | Sí | Sí | Sí | Secuencia de elementos |
| Tupla | Sí | No | Sí | Datos fijos, coordenadas |
| Conjunto | No | Sí | No | Elementos únicos, matemáticas |
| Dict | Sí* | Sí | Claves: No | Mapeo clave-valor |
*Nota: Los dicts de Python 3.7+ mantienen orden de inserción
## Resumen
- **Lista**: Ordenada, mutable, permite duplicados - usar para secuencias
- **Tupla**: Ordenada, inmutable, permite duplicados - usar para datos fijos
- **Conjunto**: No ordenado, mutable, sin duplicados - usar para elementos únicos
- **Dict**: Pares clave-valor, ordenado - usar para mapeos
- List comprehensions: `[x for x in iterable]`
- Dict comprehensions: `{k: v for k, v in items}`
- Elige la estructura de datos correcta para tus necesidades
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →