Listas, diccionarios, matrices, funciones y control de versiones con Git & GitHub
Último módulo: estructuras de datos, funciones y control de versiones
[ ] y cada elemento se accede por su índice, que comienza en 0.
-1 accede al último elemento, -2 al anteúltimo, y así.
listas_basico.pyfrutas = ["manzana", "pera", "uva"] print(frutas[0]) # manzana print(frutas[-1]) # uva (último) print(frutas[1:3]) # ['pera', 'uva'] frutas[1] = "kiwi" # modificar frutas.append("piña") # agregar al final print(frutas) # ['manzana', 'kiwi', 'uva', 'piña'] print(len(frutas)) # 4
| Método | Qué hace |
|---|---|
| .append(x) | Agrega x al final |
| .insert(i, x) | Inserta x en la posición i |
| .remove(x) | Elimina la primera coincidencia de x |
| .pop(i) | Elimina y retorna el elemento en i |
| .sort() | Ordena la lista (de menor a mayor) |
| len(lista) | Cantidad de elementos |
| x in lista | True si x está en la lista |
for. Si necesitamos el índice además del valor, usamos range(len(...)).
recorrer_listas.pynotas = [85, 90, 78, 95] # Recorrido simple for nota in notas: print(nota) # Recorrido con índice for i in range(len(notas)): print(i, "->", notas[i]) # Buscar y modificar if 90 in notas: print("Está en la lista") notas.sort() print(notas) # [78, 85, 90, 95]
clave: valor. Se define con llaves { } y se accede por clave, no por posición numérica.
| Estructura | Acceso |
|---|---|
| Lista | lista[0] — por posición |
| Diccionario | dic["clave"] — por nombre |
diccionarios_basico.pyalumno = { "nombre": "Ana", "edad": 20, "carrera": "Informática" } print(alumno["nombre"]) # Ana alumno["edad"] = 21 # modificar alumno["seccion"] = "A" # agregar clave nueva print(alumno) # {'nombre': 'Ana', 'edad': 21, # 'carrera': 'Informática', 'seccion': 'A'}
| Método | Qué hace |
|---|---|
| .keys() | Retorna todas las claves |
| .values() | Retorna todos los valores |
| .items() | Retorna pares (clave, valor) |
| .get(clave, x) | Busca clave; si no existe, retorna x |
diccionario["clave_inexistente"] lanza KeyError. Por eso .get() es más seguro cuando la clave podría no existir.
recorrer_dict.py# Recorrer solo claves for clave in alumno: print(clave, "->", alumno[clave]) # Recorrer clave y valor juntos for clave, valor in alumno.items(): print(f"{clave}: {valor}") # Acceso seguro con valor por defecto print(alumno.get("telefono", "No registrado")) print(alumno.keys()) print(alumno.values())
¿Qué imprime este código?
datos = {"a": 1, "b": 2} datos["c"] = 3 print(len(datos))
len(datos) retorna 3. El error (KeyError) solo ocurre al leer una clave inexistente, no al asignarla.matriz[fila][columna].
matrices.pymatriz = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print(matriz[0][0]) # 1 (fila 0, col 0) print(matriz[1][2]) # 6 (fila 1, col 2) # Recorrido completo: fila por fila for fila in matriz: for valor in fila: print(valor, end=" ") print() # 1 2 3 # 4 5 6 # 7 8 9
📋 Cada elemento de la lista es un diccionario completo. Para llegar a un dato puntual: primero el índice de la lista, luego la clave del diccionario.
alumnos[0]["nombre"] → accede al nombre del primer alumno de la lista.
lista_de_dicts.pyalumnos = [ {"nombre": "Ana", "nota": 6.5}, {"nombre": "Luis", "nota": 5.2}, {"nombre": "Eva", "nota": 7.0} ] print(alumnos[0]["nombre"]) # Ana for alumno in alumnos: print(alumno["nombre"], "->", alumno["nota"]) # Calcular promedio del curso suma = 0 for alumno in alumnos: suma += alumno["nota"] print(f"Promedio: {suma/len(alumnos):.2f}")
| Estructura | Cuándo usarla |
|---|---|
| Lista de diccionarios | Varios registros, misma estructura |
| Diccionario de listas | Agrupar valores por categoría |
inventario["frutas"] devuelve la lista completa de frutas — luego se recorre o se modifica como cualquier lista.
dict_de_listas.pyinventario = { "frutas": ["manzana", "pera"], "verduras": ["zanahoria", "lechuga", "papa"] } for categoria, items in inventario.items(): print(categoria, "->", len(items), "items") for item in items: print(" -", item) # Agregar un elemento a una categoría inventario["frutas"].append("kiwi") print(inventario["frutas"]) # ['manzana', 'pera', 'kiwi']
Necesitás guardar varios alumnos, cada uno con su nombre y su nota. ¿Qué estructura es la más adecuada?
"nombre", "nota") — mucho más claro que recordar posiciones numéricas como en una lista de listas. La opción C separaría los datos de cada alumno en listas distintas, perdiendo la relación directa entre nombre y nota de la misma persona.def, puede recibir parámetros, y puede devolver un valor con return.
def_basico.pydef saludar(nombre): print(f"Hola, {nombre}!") saludar("Ana") # Hola, Ana! saludar("Luis") # Hola, Luis!
nombre al definir la función es el parámetro; "Ana" al llamarla es el argumento.
| print() | return |
|---|---|
| Muestra en pantalla | Entrega el valor a quien llamó |
| No se puede reutilizar | El resultado se puede guardar y usar |
return_vs_print.pydef cuadrado(numero): return numero ** 2 resultado = cuadrado(5) print(resultado) # 25 print(cuadrado(3) + 1) # 10 # El valor de "return" se puede # guardar, sumar, comparar, etc.
Encapsula la lógica de validación
Reutilizable para edad, nota, opción, etc.
Listo para usar en el resto del programa
funcion_reutilizable.pydef pedir_entero(mensaje): while True: texto = input(mensaje) if texto.isdigit(): return int(texto) print("⚠ Ingresá un número entero") # Una sola función, usada varias veces edad = pedir_entero("Edad: ") nota = pedir_entero("Nota: ") print(f"Edad: {edad}, Nota: {nota}")
¿Qué imprime este código?
def doble(n): n * 2 resultado = doble(5) print(resultado)
return explícito, Python retorna None automáticamente. Por eso resultado vale None, no 10. Es un error muy común: confundir calcular un valor con devolverlo.| Comando | Qué hace |
|---|---|
| git init | Crea un repositorio nuevo |
| git status | Muestra cambios pendientes |
| git add archivo | Prepara un cambio para guardar |
| git commit -m "msj" | Guarda una versión con un mensaje |
| git log | Muestra el historial de versiones |
terminal# Crear el repositorio git init # Ver qué cambió git status # Preparar el cambio git add validaciones.py # Guardar la versión git commit -m "Agrego validación de edad" # Ver el historial git log # ── salida típica de git log ── # commit a3f9c2d # Author: Tu Nombre # Date: hoy # Agrego validación de edad
| Comando | Qué hace |
|---|---|
| git remote add origin url | Conecta el repo local con GitHub |
| git push origin main | Sube los cambios locales |
| git pull origin main | Trae los cambios remotos |
| git clone url | Copia un repositorio existente |
terminal# Conectar el repo local con GitHub git remote add origin https://github.com/usuario/proyecto.git # Subir los cambios guardados git push origin main # Traer cambios que hizo otra persona # (o que subiste desde otro computador) git pull origin main # Copiar un repositorio que ya existe git clone https://github.com/usuario/proyecto.git # ↑ Crea una carpeta local con todo # el historial del proyecto
push sube tus commits a GitHub; pull trae los commits que faltan en tu copia local.
main). Los cambios se integran mediante un Pull Request.
git checkout -b nombre-rama
git push origin nombre-rama
Proponer en GitHub que se integren los cambios
El equipo revisa, aprueba e integra a main
terminal# Crear y moverse a una rama nueva git checkout -b nueva-funcionalidad # ... trabajar y hacer commits ... git add . git commit -m "Agrego validación de notas" # Subir la rama a GitHub git push origin nueva-funcionalidad # Luego: abrir Pull Request en GitHub.com # El equipo revisa y aprueba el merge
¿Cuál es el orden correcto para guardar un cambio localmente y luego subirlo a GitHub?
Colección ordenada y mutable. Acceso por índice [0,1,2...]. append, remove, sort.
Pares clave:valor. Acceso por clave. keys(), values(), items(), get().
Listas de listas: matriz[fila][columna]. For anidado para recorrer.
Lista de diccionarios (registros) y diccionario de listas (categorías).
def, parámetros, return. Evitan repetir código — reutilizables.
add → commit → push. Branches y Pull Requests para trabajo en equipo.
Ya manejan estructuras de datos, funciones y control de versiones — las bases de cualquier proyecto real. Sigan practicando y suban su código a GitHub.