Introducción al módulo de colecciones de Python

Las colecciones en Python son contenedores que se utilizan para almacenar colecciones de datos, por ejemplo, listas, dictados, conjuntos, tuplas, etc. Estas son colecciones integradas. Cortar...

Introducción

Las colecciones en Python son contenedores que se utilizan para almacenar colecciones de datos, por ejemplo, list, dict, set, tuple, etc. Estas son colecciones integradas. Se han desarrollado varios módulos que proporcionan estructuras de datos adicionales para almacenar colecciones de datos. Uno de esos módulos es Python [módulo de colecciones] (https://docs.python.org/2/library/collections.html).

El módulo de colecciones de Python se introdujo para mejorar las funcionalidades de los contenedores de colección integrados. El módulo de colecciones de Python se introdujo por primera vez en su versión 2.4. Este tutorial se basa en su última versión estable (versión 3.7).

Módulo de colecciones

En este tutorial, analizaremos 6 de las estructuras de datos más utilizadas del módulo de colecciones de Python. Son los siguientes:

El Contador

Contador es una subclase de objeto de diccionario. La función Contador() en el módulo de colecciones toma un iterable o un mapeo como argumento y devuelve un Diccionario. En este diccionario, una clave es un elemento en el iterable o el mapeo y el valor es el número de veces que ese elemento existe en el iterable o el mapeo.

Tienes que importar la clase Contador antes de poder crear una instancia de contador.

1
from collections import Counter
Crear objetos de contador

Hay varias formas de crear objetos contadores. La forma más sencilla es utilizar la función Counter() sin argumentos.

1
cnt = Counter()

Puede pasar una iterable (lista) a la función Contador() para crear un objeto contador.

1
2
list = [1,2,3,4,1,2,6,7,3,8,1]
Counter(list)

Finalmente, la función Contador() puede tomar un diccionario como argumento. En este diccionario, el valor de una clave debe ser el 'recuento' de esa clave.

1
Counter({1:3,2:4})

Puede acceder a cualquier elemento del contador con su clave como se muestra a continuación:

1
2
3
list = [1,2,3,4,1,2,6,7,3,8,1]
cnt = Counter(list)
print(cnt[1])

cuando imprima cnt[1], obtendrá la cuenta de 1.

Producción:

1
3

En los ejemplos anteriores, cnt es un objeto de la clase Contador que es una subclase de dict. Así que tiene todos los métodos de la clase dict.

Aparte de eso, Contador tiene tres funciones adicionales:

  1. Elementos
  2. Más_común([n])
  3. Resta ([interable-or-mapping])
La función element()

Puede obtener los elementos de un objeto ‘Contador’ con la función ’elementos ()’. Devuelve una lista que contiene todos los elementos del objeto Contador.

Mira el siguiente ejemplo:

1
2
cnt = Counter({1:3,2:4})
print(list(cnt.elements()))

Producción:

1
[1, 1, 1, 2, 2, 2, 2]

Aquí, creamos un objeto Contador con un diccionario como argumento. En este objeto Counter, la cuenta de 1 es 3 y la cuenta de 2 es 4. La función elements() se llama usando el objeto cnt que devuelve un iterador que se pasa como argumento a la lista.

El iterador repite 3 veces sobre 1 devolviendo tres '1's, y repite cuatro veces sobre 2 devolviendo cuatro '2's a la lista. Finalmente, la lista se imprime utilizando la función imprimir.

La función más_común() {#la funciónmás_común}

La función Contador() devuelve un diccionario desordenado. Puede ordenarlo según el número de conteos en cada elemento usando la función most_common() del objeto Contador.

1
2
3
list = [1,2,3,4,1,2,6,7,3,8,1]
cnt = Counter(list)
print(cnt.most_common())

Producción:

1
[(1, 3), (2, 2), (3, 2), (4, 1), (6, 1), (7, 1), (8, 1)]

Puede ver que la función most_common devuelve una lista, que se ordena según el recuento de los elementos. El 1 tiene una cuenta de tres, por lo tanto es el primer elemento de la lista.

La función de sustracción()

subtract() toma iterable (lista) o un mapeo (diccionario) como argumento y deduce el conteo de elementos usando ese argumento. Revisa el siguiente ejemplo:

1
2
3
4
cnt = Counter({1:3,2:4})
deduct = {1:1, 2:2}
cnt.subtract(deduct)
print(cnt)

Producción:

1
Counter({1: 2, 2: 2})

Puede notar que el objeto cnt que creamos primero tiene una cuenta de 3 para '1' y una cuenta de 4 para '2'. El diccionario deduct tiene el valor '1' para la clave '1' y el valor '2' para la clave '2'. La función subtract() dedujo 1 conteo de la tecla '1' y 2 conteos de la tecla '2'.

El dictamen predeterminado {#el dictamen predeterminado}

El defaultdict funciona exactamente como un diccionario de python, excepto que no arroja KeyError cuando intenta acceder a una clave inexistente.

En su lugar, inicializa la clave con el elemento del tipo de datos que pasa como argumento en la creación de defaultdict. El tipo de datos se llama default_factory.

Importar dictamen predeterminado

Primero, debe importar defaultdict desde el módulo colecciones antes de usarlo:

1
from collections import defaultdict
Crear un dictamen predeterminado

Puede crear un defaultdict con el constructor defaultdict(). Debe especificar un tipo de datos como argumento. Compruebe el siguiente código:

1
2
3
4
nums = defaultdict(int)
nums['one'] = 1
nums['two'] = 2
print(nums['three'])

Producción:

1
0

En este ejemplo, int se pasa como default_factory. Tenga en cuenta que solo pasa int, no int(). A continuación, se definen los valores para las dos claves, a saber, 'uno' y 'dos', pero en la siguiente línea intentamos acceder a una clave que aún no se ha definido.

En un diccionario normal, esto forzará un KeyError. Pero defaultdict inicializa la nueva clave con el valor predeterminado de default_factory que es 0 para int. Por lo tanto, cuando se ejecuta el programa, se imprimirá un 0. Esta característica particular de inicializar claves inexistentes se puede explotar en varias situaciones.

Por ejemplo, supongamos que desea contar cada nombre en una lista de nombres dados como "Mike, John, Mike, Anna, Mike, John, John, Mike, Mike, Britney, Smith, Anna, Smith\ “.

1
2
3
4
5
6
7
from collections import defaultdict

count = defaultdict(int)
names_list = "Mike John Mike Anna Mike John John Mike Mike Britney Smith Anna Smith".split()
for names in names_list:
    count[names] +=1
print(count)

Producción:

1
defaultdict(<class 'int'>, {'Mike': 5, 'Britney': 1, 'John': 3, 'Smith': 2, 'Anna': 2})

Primero, creamos un defaultdict con int como default_factory. La names_list incluye un conjunto de nombres que se repiten varias veces. La función split() devuelve una lista de la cadena dada. Rompe la cadena cada vez que se encuentra un espacio en blanco y devuelve palabras como elementos de la lista. En el bucle, cada elemento de la lista se agrega al defaultdict denominado count y se inicializa a 0 según default_factory. Si se vuelve a encontrar el mismo elemento, a medida que continúa el bucle, se incrementará la cuenta de ese elemento.

El dictado ordenado {#el dictado ordenado}

OrderedDict es un diccionario donde las claves mantienen el orden en que se insertan, lo que significa que si cambia el valor de una clave más tarde, no cambiará la posición de la clave.

Importar dictamen ordenado

Para usar OrderedDict tienes que importarlo desde el módulo de colecciones.

1
from collections import OrderedDict
Crear un dictado ordenado

Puede crear un objeto OrderedDict con el constructor OrderedDict(). En el siguiente código, creas un OrderedDict sin ningún argumento. Después de eso, algunos elementos se insertan en él.

1
2
3
4
5
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od)

Producción:

1
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

También puede acceder a cada elemento mediante un bucle. Echa un vistazo al siguiente código:

1
2
for key, value in od.items():
    print(key, value)

Producción:

1
2
3
a 1
b 2
c 3

El siguiente ejemplo es un caso de uso interesante de OrderedDict con Counter. Aquí, creamos un ‘Contador’ a partir de una lista e insertamos un elemento en un ‘OrderedDict’ en función de su recuento.

La letra que aparece con más frecuencia se insertará como la primera tecla y la letra que aparece con menos frecuencia se insertará como la última tecla.

1
2
3
4
5
list = ["a","c","c","a","b","a","a","b","c"]
cnt = Counter(list)
od = OrderedDict(cnt.most_common())
for key, value in od.items():
    print(key, value)

Producción:

1
2
3
a 4
c 3
b 2

El deque

El deque es una lista optimizada para insertar y eliminar elementos.

Importar el deque

Tienes que importar la clase deque desde el módulo colecciones antes de usarlo.

1
from collections import deque
Creando un deque

Puede crear una deque con el constructor deque(). Tienes que pasar una lista como argumento.

1
2
3
list = ["a","b","c"]
deq = deque(list)
print(deq)

Producción:

1
deque(['a', 'b', 'c'])
Inserción de elementos para deque

Puede insertar fácilmente un elemento en el deq que creamos en cualquiera de los extremos. Para agregar un elemento a la derecha de la deque, debe usar el método append().

Si desea agregar un elemento al comienzo de la deque, debe usar el método appendleft().

1
2
3
deq.append("d")
deq.appendleft("e")
print(deq)deque

Producción:

1
deque(['e', 'a', 'b', 'c', 'd'])

Puede notar que d se agrega al final de deq y e se agrega al comienzo de deq

Eliminación de elementos de la deque

La eliminación de elementos es similar a la inserción de elementos. Puede eliminar un elemento de la misma manera que inserta elementos. Para eliminar un elemento del extremo derecho, puede usar la función pop() y para eliminar un elemento de la izquierda, puede usar popleft().

1
2
3
deq.pop()
deq.popleft()
print(deq)

Producción:

1
deque(['a', 'b', 'c'])

Puede notar que tanto el primer como el último elemento se eliminan del deq.

Limpiando un deque

Si desea eliminar todos los elementos de una deque, puede usar la función clear().

1
2
3
4
list = ["a","b","c"]
deq = deque(list)
print(deq)
print(deq.clear())

Producción:

1
2
deque(['a', 'b', 'c'])
None

Puede ver en la salida, al principio hay una cola con tres elementos. Una vez que aplicamos la función clear(), la deque se borra y verá none en la salida.

Elementos de conteo en un deque

Si desea encontrar el recuento de un elemento específico, use la función count(x). Debe especificar el elemento para el que necesita encontrar el recuento, como argumento.

1
2
3
list = ["a","b","c"]
deq = deque(list)
print(deq.count("a"))

Producción:

1
1

En el ejemplo anterior, el recuento de 'a' es 1. Por lo tanto, se imprime '1'.

El mapa de cadena {#el mapa de cadena}

ChainMap se utiliza para combinar varios diccionarios o asignaciones. Devuelve una lista de diccionarios.

Importar mapa de cadena

Tienes que importar ChainMap desde el módulo colecciones antes de usarlo.

1
from collections import ChainMap
Crear un ChainMap

Para crear un mapa de cadena podemos usar el constructor ChainMap(). Tenemos que pasar los diccionarios que vamos a combinar como un conjunto de argumentos.

1
2
3
4
dict1 = { 'a' : 1, 'b' : 2 }
dict2 = { 'c' : 3, 'b' : 4 }
chain_map = ChainMap(dict1, dict2)
print(chain_map.maps)

Producción:

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

Puede ver una lista de diccionarios como salida. Puede acceder a los valores del mapa de cadena por nombre de clave.

1
print(chain_map['a'])

Producción:

1
1

'1' se imprime como el valor de la clave 'a' es 1. Otro punto importante es que ChainMap actualiza sus valores cuando se actualizan sus diccionarios asociados. Por ejemplo, si cambia el valor de 'c' en dict2 a '5', también notará el cambio en ChainMap.

1
2
dict2['c'] = 5
print(chain_map.maps)

Producción:

1
[{'a': 1, 'b': 2}, {'c': 5, 'b': 4}]
Obtener claves y valores de ChainMap

Puede acceder a las claves de un ChainMap con la función keys(). De manera similar, puede acceder a los valores de los elementos con la función values(), como se muestra a continuación:

1
2
3
4
5
dict1 = { 'a' : 1, 'b' : 2 }
dict2 = { 'c' : 3, 'b' : 4 }
chain_map = ChainMap(dict1, dict2)
print (list(chain_map.keys()))
print (list(chain_map.values()))

Producción:

1
2
['b', 'a', 'c']
[2, 1, 3]

Observe que el valor de la clave 'b' en la salida es el valor de la clave 'b' en dict1. Como regla general, cuando una clave aparece en más de un diccionario asociado, “ChainMap” toma el valor de esa clave del primer diccionario.

Adición de un nuevo diccionario a ChainMap

Si desea agregar un nuevo diccionario a un ChainMap existente, use la función new_child(). Crea un nuevo ChainMap con el diccionario recién agregado.

1
2
3
dict3 = {'e' : 5, 'f' : 6}
new_chain_map = chain_map.new_child(dict3)
print(new_chain_map)

Producción:

1
ChainMap({'f': 6, 'e': 5}, {'a': 1, 'b': 2}, {'b': 4, 'c': 3})

Observe que se agrega un nuevo diccionario al comienzo de la lista ChainMap.

La tupla nombrada() {#la tupla nombrada}

namedtuple() devuelve una tupla con nombres para cada posición en la tupla. Uno de los mayores problemas con las tuplas ordinarias es que debe recordar el índice de cada campo de un objeto de tupla. Esto es obviamente difícil. El tuple con nombre se introdujo para resolver este problema.

Importar tupla con nombre {#importar tupla con nombre}

Antes de usar namedtuple, debe importarlo desde el módulo colecciones.

1
from collections import namedtuple
Crear una tupla con nombre
1
2
3
4
5
from collections import namedtuple

Student = namedtuple('Student', 'fname, lname, age')
s1 = Student('John', 'Clarke', '13')
print(s1.fname)

Producción:

1
Student(fname='John', lname='Clarke', age='13')

En este ejemplo, se ha declarado un objeto tuple con nombre Estudiante. Puede acceder a los campos de cualquier instancia de una clase Estudiante por el nombre de campo definido.

Creación de una tupla con nombre usando la lista

La función namedtuple() requiere que cada valor se le pase por separado. En cambio, puedes usar _make() para crear una instancia namedtuple con una lista. Compruebe el siguiente código:

1
2
s2 = Student._make(['Adam','joe','18'])
print(s2)

Producción:

1
Student(fname='Adam', lname='joe', age='18')
Crear una nueva instancia usando una instancia existente

La función _asdict() se puede usar para crear una instancia de OrderedDict a partir de una instancia existente.

1
2
s2 = s1._asdict()
print(s2)

Producción:

1
OrderedDict([('fname', 'John'), ('lname', 'Clarke'), ('age', '13')])
Cambio de valores de campo con la función _replace() {#cambio de valores de campo con_replacefunction}

Para cambiar el valor de un campo de una instancia se utiliza la función _replace(). Recuerda que la función _replace() crea una nueva instancia. No cambia el valor de la instancia existente.

1
2
3
s2 = s1._replace(age='14')
print(s1)
print(s2)

Producción:

1
2
Student(fname='John', lname='Clarke', age='13')
Student(fname='John', lname='Clarke', age='14')

Conclusión

Con eso, concluimos nuestro tutorial sobre el módulo Colecciones. Hemos discutido todos los temas importantes en el módulo de colección. El módulo de colección de Python todavía necesita mejoras si lo comparamos con la biblioteca de colección de Java. Por lo tanto, podemos esperar muchos cambios en las próximas versiones.

Referencias

Licensed under CC BY-NC-SA 4.0