HOWTO · Python
Tabla de búsqueda en Python
Este tutorial demuestra cómo usar tablas de búsqueda en Python, destacando métodos como diccionarios, listas, matrices de NumPy y DataFrames de Pandas. Aprende a implementar técnicas de recuperación de datos eficientes para optimizar tus habilidades de programación y mejorar el rendimiento de las aplicaciones. Explora ejemplos de código prácticos y explicaciones detalladas para dominar las tablas de búsqueda en Python.
En esta página
Una tabla de búsqueda almacena valores para que el código pueda recuperarlos mediante una clave o una posición. Resulta útil cuando se consulta repetidamente la misma relación, como al asociar códigos de producto con precios. Precalcular un resultado puede evitar repetir un cálculo, pero la tabla ocupa memoria y debe actualizarse cuando cambian los datos de origen.
Elige la estructura según la forma de las claves y las operaciones que necesites: los diccionarios admiten claves hashables arbitrarias, las listas y los arrays usan posiciones enteras, y un DataFrame permite trabajar con columnas etiquetadas y operaciones tabulares. Los ejemplos siguientes muestran cómo resuelve cada estructura una búsqueda práctica.
Elige una estructura de tabla de búsqueda para tus datos
Primero, determina qué identifica cada valor. Usa un diccionario para nombres, códigos u otras claves que no sean posiciones enteras densas. Usa una lista cuando las posiciones sean enteros consecutivos que comiencen en cero y los valores puedan almacenarse en una secuencia de Python. Usa un array de NumPy cuando los datos sean numéricos y necesites operaciones con arrays. Usa un DataFrame de Pandas cuando cada registro tenga varios campos con nombre o necesites filtrar y realizar otras operaciones tabulares. NumPy y Pandas son dependencias de terceros; instálalas en el entorno de tu proyecto antes de usar sus ejemplos.
Usa un diccionario para búsquedas por clave
Un diccionario asigna cada clave hashable distinta a un valor. Funciona bien con claves no secuenciales y permite especificar claramente un valor alternativo mediante get. Si la clave no existe, get devuelve el valor predeterminado que indiques; en cambio, el acceso con corchetes genera KeyError cuando falta la clave.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
prices = {"tea": 2.5, "coffee": 3.0, "cocoa": 2.75}
print(prices["tea"])
print(prices.get("juice", "not listed"))
2.5
not listed
La búsqueda en un diccionario tiene un coste promedio de O(1); esto no está garantizado para todas las cargas de trabajo. Las claves deben ser hashables y, al asignar un valor a una clave existente, se reemplaza el valor anterior. Si cambian los registros de origen, actualiza también el diccionario para evitar resultados desactualizados. En el ejemplo, la búsqueda de una clave ausente devuelve el valor predeterminado y el texto not listed permanece en inglés porque el bloque de código y su salida se conservan sin cambios.
Usa una lista para índices enteros densos
Una lista es una tabla sencilla cuando los índices válidos son densos y comienzan en cero: el índice i corresponde al elemento número (i + 1). No es adecuada para identificadores dispersos, como números de cliente, porque los huecos exigirían posiciones sin usar o una asignación aparte. El acceso por índice a una lista es O(1); sus valores siguen siendo objetos normales de Python.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
labels = ["bronze", "silver", "gold"]
def label_for(index):
if 0 <= index < len(labels):
return labels[index]
return "index out of range"
print(label_for(2))
print(label_for(5))
gold
index out of range
La comprobación explícita del rango gestiona tanto los índices menores que cero como los que son iguales o superiores a la longitud de la lista. Las listas de Python también permiten índices negativos, que cuentan desde el final; por eso, valida el índice primero si las claves de tu tabla solo admiten posiciones no negativas. La etiqueta index out of range del ejemplo permanece en inglés porque el bloque de código y su salida se conservan sin cambios.
Usa un array de NumPy para datos numéricos
Un array de NumPy resulta útil cuando la tabla contiene valores numéricos y también necesitas cálculos vectorizados, segmentación u otras operaciones con arrays. Instala NumPy por separado: no forma parte de la biblioteca estándar de Python. Una búsqueda escalar sigue siendo simplemente un acceso por índice, así que un array no es automáticamente más rápido que un diccionario.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import numpy as np
rates = np.array([1.0, 1.5, 2.0, 2.5])
index = 2
if 0 <= index < len(rates):
print(rates[index])
else:
print("index out of range")
print((rates * 2).tolist())
2.0
[2.0, 3.0, 4.0, 5.0]
La comprobación de límites es útil cuando el índice procede de una entrada externa. Por lo general, los arrays de NumPy usan un único tipo de elemento, lo que facilita las operaciones numéricas; elige el tipo y la forma que correspondan a los datos que necesitas almacenar. La etiqueta index out of range permanece en inglés dentro del bloque de código inmutable; la salida del caso mostrado contiene valores numéricos.
Usa un DataFrame de Pandas para datos tabulares
Un DataFrame se adapta a registros con columnas con nombre, sobre todo cuando la búsqueda forma parte de una tarea más amplia de filtrado o análisis. Instala Pandas por separado. Filtrar por una columna compara filas y, si solo seleccionas filas, devuelve un DataFrame. En la expresión siguiente, seleccionar la única columna price con .loc devuelve una Serie; el filtro puede recorrer las filas. Para búsquedas repetidas por clave, considera establecer un índice significativo y usar .loc.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
items = pd.DataFrame({
"code": ["A", "B", "C"],
"price": [1.25, 2.50, 3.75],
})
match = items.loc[items["code"] == "B", "price"]
if not match.empty:
print(match.iloc[0])
else:
print("not found")
2.5
Este patrón gestiona la ausencia de un código coincidente sin intentar acceder a un resultado vacío. En el ejemplo, el código B sí coincide, por lo que la salida muestra «2.5» y la rama alternativa con not found no se ejecuta. La etiqueta de la rama alternativa permanece en inglés porque el bloque de código se conserva sin cambios. Si los códigos son únicos y se consultan repetidamente, items.set_index("code").loc["B", "price"] expresa una búsqueda por etiqueta; comprueba que el código exista antes de acceder a él y decide cómo gestionar las etiquetas duplicadas.
Gestiona las claves ausentes y los índices no válidos
Elige una política para los valores ausentes que se ajuste a quien llama a la función. dict.get(key, default) devuelve un valor alternativo, mientras que key in mapping permite distinguir una clave ausente de otra cuyo valor almacenado coincide con el valor alternativo. Usa try/except KeyError cuando la lógica circundante considere excepcionales las claves ausentes. Para listas y arrays, valida el índice con 0 <= index < len(table) si las posiciones negativas no deben contar desde el final. Si filtras un DataFrame, comprueba si el resultado está vacío antes de seleccionar su primera fila. Mantén la política coherente entre funciones para que quien las use sepa si una ausencia devuelve un valor centinela, un valor predeterminado o un error.
Compara el rendimiento y las ventajas prácticas
La búsqueda por clave en un diccionario tiene un coste promedio de O(1), mientras que el acceso por posición a una lista o a un array unidimensional cuesta O(1). Un filtro booleano de DataFrame suele costar O(n), porque evalúa las filas; un índice puede facilitar el acceso por etiqueta, pero su coste y comportamiento dependen de cómo se construya y de la forma de los datos. Estas complejidades no predicen el tiempo real para todos los tamaños de entrada: también influyen los costes de preparación, los tipos de clave, la disposición de los datos, las operaciones de la biblioteca y la memoria.
Usa la estructura más sencilla que encaje con las claves y las operaciones: diccionario para claves arbitrarias, lista para posiciones densas, array de NumPy para operaciones numéricas con arrays y DataFrame para datos tabulares etiquetados. Si el rendimiento es decisivo, mide con datos representativos. Ten en cuenta también la memoria: los diccionarios almacenan asociaciones entre claves y valores, las listas contienen referencias a objetos de Python y los arrays de NumPy almacenan elementos tipados; el uso real depende de los datos y de la implementación. Si una tabla de búsqueda se deriva de datos de origen que cambian, vuelve a crearla o actualízala cada vez que cambien para evitar resultados desactualizados.