Estructuras de datos

Python incluye varias estructuras de datos de programación estándar, como list, tuple, dict, y set, como parte de sus tipos incorporados. Muchas aplicaciones no requieren otras estructuras, pero cuando lo hacen, la biblioteca estándar proporciona versiones poderosa y bien probadas que están listas para ser usadas.

El módulo enum proporciona una implementación del tipo enumeración, con capacidades de iteración y comparación. Se puede usar para crear símbolos bien definidos para valores, en lugar de usar cadenas literales o enteros.

El módulo collections incluye implementaciones de varias estructuras de datos que amplían las encontradas en otros módulos. Por ejemplo, Deque es una cola de doble extremo, que permite la adición o eliminación de elementos de ambos extremos. El defaultdict es un diccionario que responde con un valor predeterminado si falta una clave, mientras que OrderedDict recuerda la secuencia en la que se agregan los elementos a ésta. namedtuple extiende el tuple normal para dar a cada elemento un nombre de atributo además de un índice numérico.

Para grandes cantidades de datos, un array puede hacer un uso más eficiente de memoria que una list. Como el array está limitado a un solo tipo de datos, puede usar una representación de memoria más compacta que una list de propósito general. Al mismo tiempo, las instancias de array se pueden manipular usando muchos de los mismos métodos que list, por lo que es posible reemplazar una list con un array en una aplicación sin muchos cambios

Ordenar elementos en una secuencia es un aspecto fundamental de la manipulación de datos. La list de Python incluye un método sort(), pero a veces es más eficiente mantener una lista ordenada sin volver a clasificarla cada vez que su contenido cambia. Las funciones en heapq modifican el contenido de una lista mientras preservan el orden de la lista con poca sobrecarga.

Otra opción para crear listas ordenadas o arrays es bisect. Este utiliza una búsqueda binaria para encontrar el punto de inserción para nuevos elementos, y es una alternativa a ordenar repetidamente una lista que cambia frecuentemente.

Aunque la list incorporada puede simular una cola usando los métodos insert() y pop(), no es segura para subprocesos. Para una comunicación ordenada entre hilos de verdad usa el módulo queue. multiprocessing incluye una versión de Queue que funciona entre procesos, haciendo más fácil convertir un programa multi-hilo para que use procesos en su lugar.

struct es útil para decodificar datos de otra aplicación, quizás viniendo de un archivo binario o una secuencia de datos, en tipos Python nativos para una manipulación más fácil.

Este capítulo cubre dos módulos relacionados con la gestión de la memoria. Para estructuras de datos altamente interconectadas, como gráficos y árboles, usa weakref para mantener referencias mientras se permite que el recolector de basura limpie los objetos una vez que ya no son necesarios. Utiliza las funciones en copy para duplicar estructuras de datos y sus contenidos, incluida la realización de copias recursivas con deepcopy().

La depuración de las estructuras de datos puede llevar mucho tiempo, especialmente cuando recorriendo la salida impresa de grandes secuencias o diccionarios. Utiliza pprint para crear representaciones fáciles de leer que pueden ser impresas en la consola o escritas en un archivo de registro para una depuración más fácil.

Finalmente, si los tipos disponibles no cumplen con los requisitos, subclasifica uno de los tipos nativos y personalízalo, o construye un nuevo tipo de contenedor utilizando una de las clases base abstractas definidas en collections como punto de partida.