Módulo collections¶
El módulo integrado de colecciones nos proveé otros tipos o mejoras de las colecciones clásicas.
Contadores¶
La clase Counter es una subclase de diccionario utilizada para realizar cuentas:
from collections import Counter
l = [1,2,3,4,1,2,3,1,2,1]
Counter(l)
Counter({1: 4, 2: 3, 3: 2, 4: 1})
Counter("palabra")
Counter({'a': 3, 'b': 1, 'l': 1, 'p': 1, 'r': 1})
animales = "gato perro canario perro canario perro"
c = Counter(animales.split())
priunt(c)
Counter({'canario': 2, 'gato': 1, 'perro': 3})
Algunas formas de utilizar un contador, sus métodos y conversiones:
animales = "gato perro canario perro canario perro"
c = Counter(animales.split())
print(c.most_common(1)) # Primeros elemento más repetido
print(c.most_common(2)) # Primeros dos elementos más repetidos
print(c.most_common()) # Elementos ordenadores por repeticiones
[('perro', 3)]
[('perro', 3), ('canario', 2)]
[('perro', 3), ('canario', 2), ('gato', 1)]
l = [10,20,30,40,10,20,30,10,20,10]
c = Counter(l)
print(c.items()) # Registros del contador por clave-valor
print(c.keys()) # Registros del contador por clave
print(c.values()) # Registros del contador por valor
print(sum(c.values())) # Suma total de elementos del contador
print(list(c)) # Conversión a lista
print(dict(c)) # Conversión a conjunto
print(set(c)) # Conversión a conjunto
dict_items([(40, 1), (10, 4), (20, 3), (30, 2)])
dict_keys([40, 10, 20, 30])
dict_values([1, 4, 3, 2])
10
[40, 10, 20, 30]
{10: 4, 20: 3, 30: 2, 40: 1}
{10, 20, 30, 40}
Diccionarios por defecto¶
La clase defaultdict se utilizan para crear diccionarios con un valor por defecto aunque el registro no haya sido definido anteriormente. Para ello hay que indicar un tipo de dato por defecto al diccionario:
from collections import defaultdict
d = defaultdict(float) # tipo flotante por defecto
print(d['algo'])
print(d)
0.0
defaultdict(float, {'algo': 0.0})
d = defaultdict(str) # tipo cadena por defecto
print(d['algo'])
print(d)
''
defaultdict(str, {'algo': ''})
d = defaultdict(object) # tipo objeto por defecto
print(d['algo'])
print(d)
<object at 0x1ad7f3201f0>
defaultdict(object, {'algo': <object at 0x1ad7f3201f0>})
Diccionarios ordenados¶
La clase OrderedDict es otra subclase de diccionario, pero esta vez con la capacidad de conservar el orden en que añadimos los registros:
from collections import OrderedDict
n = OrderedDict()
n['uno'] = 'one'
n['dos'] = 'two'
n['tres'] = 'three'
print(n)
OrderedDict([('uno', 'one'), ('dos', 'two'), ('tres', 'three')])
El siguiente experimento permite comprobar como los diccionarios normales cambian el orden automáticamente.
Dos diccionarios normales con los mismos elementos en orden distinto:
n1 = {}
n1['uno'] = 'one'
n1['dos'] = 'two'
n2 = {}
n2['dos'] = 'two'
n2['uno'] = 'one'
# ¿Tienen los mismos elementos y en el mismo orden?
print(n1 == n2)
True
Dos diccionarios ordenados con los mismos elementos en orden distinto:
n1 = OrderedDict()
n1['uno'] = 'one'
n1['dos'] = 'two'
n2 = OrderedDict()
n2['dos'] = 'two'
n2['uno'] = 'one'
# ¿Tienen los mismos elementos y en el mismo orden?
print(n1 == n2)
False
Tuplas con nombre¶
La subclase namedtuple es utilizada para crear pequeñas estructuras inmutables, parecidas a una clase y sus objetos, pero mucho más simples:
from collections import namedtuple
Persona = namedtuple('Persona','nombre apellido edad')
p = Persona(nombre="Hector",apellido="Costa",edad=27)
print(p)
# Podemos acceder a los elementos como si fueran atributos de un objeto
print(p.nombre)
print(p.edad)
# O utilizando índices como con las tuplas clásicas
print(p[0])
print(p[-1])
Persona(nombre='Hector', apellido='Costa', edad=27)
'Hector'
27
'Hector'
27
Última edición: 2 de Octubre de 2018