Explorando el módulo collections de Python

PythonBeginner
Practicar Ahora

Introducción

En este tutorial, exploraremos el módulo collections integrado de Python. El módulo collections es una poderosa biblioteca que ofrece una variedad de tipos de datos de contenedor que extienden la funcionalidad de los contenedores integrados de Python, como listas, tuplas y diccionarios.

NamedTuple

Un namedtuple es una subclase de una tupla que proporciona campos con nombres para una mayor legibilidad y código auto-documentado. Vamos a crear un namedtuple en named_tuple.py para representar un punto en un espacio bidimensional:

## Import collections
from collections import namedtuple

## Define a namedtuple type Point with x and y properties
Point = namedtuple('Point', ['x', 'y'])

## Create a Poinit object
p = Point(1, 2)

## Retrieve the properties of point
print(p.x)
print(p.y)

Luego, ejecute el script en la terminal:

python named_tuple.py

Salida:

1
2

Counter

Counter es una subclase de dict que cuenta la frecuencia de aparición de los elementos en una colección. Vamos a crear un objeto Counter en counter.py para contar la frecuencia de aparición de los caracteres en una cadena:

from collections import Counter

text = "hello, world!"
## Obtiene la cantidad de apariciones de los elementos en la colección y los devuelve como un diccionario
char_count = Counter(text)

print(char_count)

Luego, ejecute el script en la terminal:

python counter.py

Salida:

Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ',': 1,'': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1})

OrderedDict

OrderedDict es una subclase de dict que mantiene el orden en que se insertan los elementos. Vamos a crear un OrderedDict en ordered_dict.py y agregar algunos pares clave-valor:

from collections import OrderedDict

## Inicializando OrderedDict
od = OrderedDict()

## Insertando pares clave-valor
od['a'] = 1
od['b'] = 2
od['c'] = 3

## Iterando sobre los pares clave-valor e imprimiendo el contenido
for key, value in od.items():
    print(key, value)

Luego, ejecute el script en la terminal:

python ordered_dict.py

Salida:

a 1
b 2
c 3

DefaultDict

Defaultdict(int)

DefaultDict es una subclase de dict que proporciona un valor predeterminado para una clave inexistente. Vamos a crear un DefaultDict con valores predeterminados 0 en default_dict1.py y contar la frecuencia de aparición de las palabras en una frase:

from collections import defaultdict

sentence = "the quick brown fox jumps over the lazy dog"
word_count1 = defaultdict(int)

for word in sentence.split():
    ## Cuenta la frecuencia de aparición de las palabras
    word_count1[word] += 1

print(dict(word_count1))

Luego, ejecute el script en la terminal:

python default_dict1.py

Salida:

{'the': 2, 'quick': 1, 'brown': 1, 'fox': 1, 'jumps': 1, 'over': 1, 'lazy': 1, 'dog': 1}

Si no hubiéramos usado DefaultDict, el código equivalente se vería así:

sentence = "the quick brown fox jumps over the lazy dog"
result = {}

for word in sentence.split():
    if word in result:
        result[word] += 1
    else:
        result[word] = 1

print(result)

Defaultdict(list)

A continuación, vamos a crear un DefaultDict con valores predeterminados [] en default_dict2.py y almacenar los números para cada letra:

from collections import defaultdict

data = [('a', 1), ('a', 1), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
word_count2 = defaultdict(list)

for (key,value) in data:
    ## Almacena los números para cada letra
    word_count2[key].append(value)

print(dict(word_count2))

Luego, ejecute el script en la terminal:

python default_dict2.py

Salida:

{'a': [1, 1, 3], 'b': [1, 2, 3]}

Si no hubiéramos usado DefaultDict, el código equivalente se vería así:

data = [('a', 1), ('a', 1), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
result = {}

for (key, value) in data:
    if key in result:
        result[key].append(value)
    else:
        result[key] = [value]

print(result)

Defaultdict(set)

Finalmente, vamos a crear un DefaultDict con valores predeterminados set() en default_dict3.py y almacenar los números que no se repiten para cada letra:

from collections import defaultdict

data = [('a', 1), ('a', 1), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
word_count3 = defaultdict(set)

for (key,value) in data:
    ## Almacena los números que no se repiten para cada letra
    word_count3[key].add(value)

print(dict(word_count3))

Luego, ejecute el script en la terminal:

python default_dict3.py

Salida:

{'a': {1, 3}, 'b': {1, 2, 3}}

Si no hubiéramos usado DefaultDict, el código equivalente se vería así:

data = [('a', 1), ('a', 1), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
result = {}

for (key, value) in data:
    if key in result:
        result[key].add(value)
    else:
        result[key] = {value}

print(result)

Deque

Un deque (cola de doble extremo) es una generalización de pilas y colas que admite insercciones y extracciones rápidas O(1) desde ambos extremos. Vamos a crear un deque en deque.py y realizar algunas operaciones:

from collections import deque

d = deque([1, 2, 3, 4, 5])

## Agregar al final
d.append(6)
print("Agregar al final:", d)

## Agregar al principio
d.appendleft(0)
print("Agregar al principio:", d)

## Extraer del final
elemento_final = d.pop()
print("El elemento del final:", elemento_final)
print("Extraer del final:", d)

## Extraer del principio
elemento_inicial = d.popleft()
print("El elemento del principio:", elemento_inicial)
print("Extraer del principio:", d)

## Rotar el deque
d.rotate(2)
print("Rotar el deque en sentido horario:", d)

d.rotate(-2)
print("Rotar el deque en sentido antihorario:", d)

Luego, ejecute el script en la terminal:

python deque.py

Salida:

Agregar al final: deque([1, 2, 3, 4, 5, 6])
Agregar al principio: deque([0, 1, 2, 3, 4, 5, 6])
El elemento del final: 6
Extraer del final: deque([0, 1, 2, 3, 4, 5])
El elemento del principio: 0
Extraer del principio: deque([1, 2, 3, 4, 5])
Rotar el deque en sentido horario: deque([4, 5, 1, 2, 3])
Rotar el deque en sentido antihorario: deque([1, 2, 3, 4, 5])

Resumen

En este tutorial, cubrimos las principales clases proporcionadas por el módulo collections, incluyendo namedtuple, Counter, OrderedDict, DefaultDict y deque. Estas clases pueden ser útiles para diversas tareas y son excelentes complementos para tu herramienta Python.