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
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?
| Python | Sintaxis | Ordenada | Modificable | Duplicados | Equivalente PHP | Uso típico |
|---|---|---|---|---|---|---|
list | [1, 2, 2] | Sí | Sí | Sí | [1, 2, 2] (array indexado) | Registros de una consulta |
tuple | (4.6, 7.4) | Sí | No | Sí | No existe; se usa array | Coordenadas, filas fijas |
set | {"a", "b"} | No | Sí | No | array_unique() | Quitar repetidos, pertenencia |
dict | {"nit": 9001} | Sí (desde 3.7) | Sí | Claves únicas | ["nit" => 9001] (array asociativo) | Un registro, un índice por clave |
deque | deque([1, 2]) | Sí | Sí | Sí | SplQueue, SplStack | Colas y pilas eficientes |
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.
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.
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.
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).
| Algoritmo | Mejor caso | Peor caso | Con 1.000.000 de datos (peor caso) |
|---|---|---|---|
| Búsqueda lineal | O(1) | O(n) | 1.000.000 comparaciones |
| Búsqueda binaria (datos ordenados) | O(1) | O(log n) | 20 comparaciones |
| Burbuja | O(n) | O(n²) | cerca de 500.000 millones |
sorted() de Python, sort() de PHP | O(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.
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:
| Python | JSON | PHP con json_decode($x, true) |
|---|---|---|
dict | objeto {} | array asociativo |
list, tuple | arreglo [] | array indexado |
str | cadena | string |
int, float | número | int, float |
True, False | true, false | true, false |
None | null | null |
set, Decimal, date | no se convierten solos | hay 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
En el laboratorio 3 todo esto se junta: clases, diccionarios, listas y JSON para construir un CRUD contable completo con Python, MySQL y PHP.