pyLaboratorio 2: Estructuras de datos
Programación III, laboratorio 2 de 3

Estructuras de datos con Python, traducidas a PHP

Cada estructura se presenta en Python y en su equivalente PHP, porque en la práctica profesional los datos viajan entre ambos lenguajes. Vas de la lista más simple al árbol binario, pasando por conversiones, pilas, colas y algoritmos de ordenamiento que puedes ver paso a paso.

  • Python
  • PHP 8
  • Listas, tuplas, conjuntos, diccionarios
  • Conversión entre estructuras
  • Pilas y colas
  • Listas enlazadas y árboles
  • Búsqueda y ordenamiento
  • JSON como puente
Secuencia sugerida: módulos 1 a 7 en dos sesiones (estructuras nativas), 8 a 12 en dos sesiones (estructuras propias con clases, conecta con POO) y el 13 como cierre y puente al laboratorio de CRUD. Los visualizadores funcionan sin internet; los editores de Python necesitan conexión la primera vez.

Mapa de las estructuras

Antes de escribir código, decide qué estructura necesitas. Estas cuatro preguntas resuelven casi todos los casos: ¿importa el orden?, ¿se puede modificar?, ¿se permiten duplicados?, ¿buscas por posición o por clave?

PythonSintaxisOrdenadaModificableDuplicadosEquivalente PHPUso típico
list[1, 2, 2][1, 2, 2] (array indexado)Registros de una consulta
tuple(4.6, 7.4)NoNo existe; se usa arrayCoordenadas, filas fijas
set{"a", "b"}NoNoarray_unique()Quitar repetidos, pertenencia
dict{"nit": 9001}Sí (desde 3.7)Claves únicas["nit" => 9001] (array asociativo)Un registro, un índice por clave
dequedeque([1, 2])SplQueue, SplStackColas y pilas eficientes
Diferencia de fondo

PHP tiene una sola estructura, el array, que sirve de lista y de diccionario al mismo tiempo. Python separa cada comportamiento en un tipo distinto. Por eso, al pasar código de un lenguaje al otro, la pregunta no es "cómo se escribe" sino "qué comportamiento necesito".

Listas

Una lista es una secuencia ordenada y modificable. Los índices empiezan en 0 y los negativos cuentan desde el final.

Referencia frente a copia

En Python y en Java las listas se pasan por referencia. En PHP los arrays se copian al asignarlos. Este detalle causa errores reales al traducir código entre los dos lenguajes.

Depurar un listado

De la lista notas, elimina las inválidas (fuera de 0 a 5), ordénalas de mayor a menor e imprime la lista y el promedio con un decimal. Salida: [4.8, 4.0, 3.5, 2.1] y Promedio: 3.6

Tuplas y desempaquetado

Una tupla es una lista que no se puede modificar. Se usa para datos que deben permanecer fijos y para devolver varios valores. Cuando lees una fila de MySQL desde Python, llega como tupla.

Conjuntos

Un conjunto guarda valores sin repetir y sin orden. Comprobar si un valor está dentro es casi instantáneo, aunque el conjunto tenga millones de elementos. Admite las operaciones de la teoría de conjuntos.

Productos sin movimiento

Imprime, ordenados, los productos del inventario que no aparecen en ninguna venta. Salida: ['Azúcar', 'Sal']

Diccionarios

Un diccionario asocia claves con valores. Es la estructura más importante para el desarrollo web: un registro de base de datos, un formulario enviado o una respuesta JSON son, en el fondo, diccionarios.

Observa que ya estás haciendo un CRUD en memoria: crear (d[k] = v), leer (d[k]), actualizar (d[k] = nuevo) y eliminar (del d[k]).

Ventas por vendedor

Recorre la lista de ventas y acumula el total por vendedor en un diccionario. Imprime cada vendedor en orden alfabético con el formato Ana: 450000.

Conversión entre estructuras

Convertir es cambiar el comportamiento de los datos: una lista a conjunto elimina duplicados, dos listas a diccionario crean un índice, un diccionario a JSON lo prepara para enviarlo a PHP. Usa el conversor para ver el código y el resultado en ambos lenguajes.

Conversor de estructuras

Datos de partida: ciudades = ["Cali", "Buga", "Cali", "Tuluá"] y codigos = [76001, 76111, 76001, 76834]

Resultado en Python

Normalizar un formulario

Un formulario web envía los campos como texto separado por &. Conviértelo en un diccionario, pasa edad a entero e imprime el diccionario. Salida: {'nombre': 'Ana', 'edad': 20, 'ciudad': 'Cali'}

En PHP esto lo hace parse_str($datos, $salida), y es exactamente lo que ocurre con $_POST. Buen momento para mostrar que un formulario HTML y un diccionario son la misma idea.

Comprensiones y generadores

Una comprensión crea una estructura nueva en una sola línea: [expresión for elemento in colección if condición]. Es la forma idiomática de filtrar y transformar datos en Python. En PHP se logra con array_map y array_filter.

Una sola línea

Con una comprensión, obtén los nombres en mayúscula de los empleados con salario mayor a 2.000.000. Salida: ['LUIS', 'SOFÍA']

Pilas y colas

Son reglas de acceso, no tipos nuevos. En una pila (LIFO) sale primero lo último que entró: el botón deshacer, el historial del navegador. En una cola (FIFO) sale primero lo que llegó primero: turnos de atención, facturas por procesar. Pruébalas en el visualizador; cada acción muestra la línea equivalente en Python y en PHP.

Visualizador de pila y cola

  

Cola de impresión

Procesa la cola de documentos con deque. Cuando un documento tenga más de 10 páginas, imprime Reenviado: nombre y mándalo al final de la cola partido a 10 páginas (resta 10). Si tiene 10 o menos, imprime Impreso: nombre. Salida esperada:

Impreso: acta, Reenviado: informe, Impreso: carta, Impreso: informe (una por línea).

Este es el principio del algoritmo de planificación Round Robin de los sistemas operativos. Conecta con Arquitectura de Sistemas si el grupo la está cursando.

Lista enlazada con clases

Aquí construyes la estructura tú mismo. Cada nodo guarda un dato y una referencia al siguiente. Es la base para entender cómo funcionan por dentro las colas, las pilas y los árboles, y es un ejercicio directo de POO.

Insertar al inicio

Agrega a la clase un método agregar_inicio(dato). Luego crea la lista con agregar(2), agregar(3), agregar_inicio(1) e imprímela: 1 -> 2 -> 3 -> None

Pregunta de análisis: ¿por qué agregar_inicio es instantáneo y agregar se vuelve lento con muchos nodos? Introduce la notación O(1) frente a O(n).

Búsqueda y ordenamiento

Ordenar datos es una de las operaciones más frecuentes en software administrativo: listados por fecha, por valor, por nombre. Mira cómo trabaja el método burbuja: compara pares vecinos (ámbar), los intercambia si están en desorden (rojo) y en cada pasada fija el mayor al final (verde).

Ordenamiento burbuja paso a paso
Comparaciones: 0Intercambios: 0
AlgoritmoMejor casoPeor casoCon 1.000.000 de datos (peor caso)
Búsqueda linealO(1)O(n)1.000.000 comparaciones
Búsqueda binaria (datos ordenados)O(1)O(log n)20 comparaciones
BurbujaO(n)O(n²)cerca de 500.000 millones
sorted() de Python, sort() de PHPO(n)O(n log n)cerca de 20 millones

Ordenar registros por dos criterios

Ordena los empleados por área (alfabético) y, dentro de cada área, por salario de mayor a menor. Imprime solo los nombres en una lista: ['Sofía', 'Ana', 'Juan', 'Luis']

El truco del signo negativo solo sirve para números. Para textos en orden inverso se ordena dos veces aprovechando que sorted es estable.

Recursividad

Una función recursiva se llama a sí misma sobre un problema más pequeño hasta llegar a un caso base que se resuelve directo. Es la forma natural de recorrer estructuras jerárquicas: carpetas, organigramas, planes de cuentas contables.

Suma de dígitos

Escribe una función recursiva suma_digitos(n). Para 900123456 debe imprimir 30. Es el primer paso de muchos algoritmos de dígito de verificación.

Árbol binario de búsqueda

Cada nodo tiene hasta dos hijos: los menores a la izquierda y los mayores a la derecha. Así, buscar descarta la mitad del árbol en cada paso, la misma idea que la búsqueda binaria. Los índices de MySQL usan una variante de esta estructura (árboles B+), y por eso buscar por una columna indexada es tan rápido.

Pregunta para la clase: si insertas las claves ya ordenadas (10, 20, 30…), ¿qué forma toma el árbol y cuántos pasos cuesta buscar? El árbol degenera en una lista enlazada. Esto motiva los árboles balanceados (AVL, rojo-negro) sin necesidad de implementarlos.

JSON: el puente entre Python y PHP

Python y PHP no comparten memoria ni objetos. Cuando un programa en Python necesita enviar datos a una página PHP (o al revés), los convierte a texto JSON, lo envía y el otro lado lo reconstruye. Esta tabla es la regla de traducción:

PythonJSONPHP con json_decode($x, true)
dictobjeto {}array asociativo
list, tuplearreglo []array indexado
strcadenastring
int, floatnúmeroint, float
True, Falsetrue, falsetrue, false
Nonenullnull
set, Decimal, dateno se convierten soloshay que pasarlos a lista, texto o número antes

Del lado de PHP, el mismo texto se recibe y se usa así:

Respuesta de una API

Una API en PHP respondió el texto de la variable respuesta. Conviértelo a estructura Python e imprime cuántos clientes están activos y la suma de sus saldos: Activos: 2, saldo: 1750000

Siguiente paso

En el laboratorio 3 todo esto se junta: clases, diccionarios, listas y JSON para construir un CRUD contable completo con Python, MySQL y PHP.