{"id":461,"date":"2025-03-26T18:46:24","date_gmt":"2025-03-26T17:46:24","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=461"},"modified":"2025-03-26T18:58:30","modified_gmt":"2025-03-26T17:58:30","slug":"collections","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=461","title":{"rendered":"Collections"},"content":{"rendered":"\n<p>Python es conocido por su legibilidad y versatilidad. Si bien las listas (<code>list<\/code>) y los diccionarios (<code>dict<\/code>) son estructuras de datos fundamentales, la biblioteca <code>collections<\/code> ofrece una serie de contenedores especializados que pueden simplificar tu c\u00f3digo y mejorar el rendimiento en situaciones espec\u00edficas. <\/p>\n\n\n\n<p><strong>\u00bfQu\u00e9 es collections?<\/strong><\/p>\n\n\n\n<p>La biblioteca <strong><code>collections<\/code> <\/strong>forma parte de la librer\u00eda est\u00e1ndar de Python. Proporciona tipos de datos contenedores alternativos a los que ya conocemos (listas, tuplas, diccionarios, conjuntos), ofreciendo funcionalidades adicionales y optimizaciones para casos de uso particulares. No es necesario instalarla; simplemente importa el m\u00f3dulo <strong><code>collections<\/code> <\/strong>en tu c\u00f3digo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import collections<\/code><\/pre>\n\n\n\n<p><strong>Tuplas con Nombres (namedtuple)<\/strong><\/p>\n\n\n\n<p>Las tuplas son inmutables y se definen por su posici\u00f3n. Esto puede dificultar la lectura del c\u00f3digo, especialmente cuando tienes muchas variables relacionadas, <strong><code>namedtuple<\/code> <\/strong>resuelve este problema al permitirte asignar nombres a las posiciones de una tupla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"># Definimos un namedtuple llamado 'punto' con campos x e y\npunto = collections.namedtuple('punto', ['x', 'y'])\n\n# Creamos una instancia de punto\np = punto(10, 20)\n\n# Accedemos a los valores por nombre\nprint(p.x)  #  10\nprint(p.y)  #  20\n\n# Tambi\u00e9n podemos acceder por \u00edndice como una tupla normal\nprint(p[0]) #  10<\/code><\/pre>\n\n\n\n<p><strong><code>namedtuple<\/code> <\/strong>es ideal para representar registros de datos, coordenadas, o cualquier estructura donde el significado de cada elemento sea importante. Mejora la legibilidad y reduce los errores al eliminar la necesidad de recordar las posiciones de los elementos.<\/p>\n\n\n\n<p><strong>Colas Doblemente Enlazadas (deque)<\/strong><\/p>\n\n\n\n<p>Las listas son eficientes para acceder a elementos por \u00edndice, pero insertar o eliminar elementos al principio de una lista es costoso porque requiere desplazar todos los dem\u00e1s elementos. <strong><code>deque<\/code> <\/strong>proporciona una cola doblemente enlazada que permite inserciones y eliminaciones r\u00e1pidas tanto al principio como al final.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># Creamos un deque\nd = collections.deque()\n\n# Agregamos elementos al final\nd.append(1)\nd.append(2)\nd.append(3)\n\n# Agregamos elementos al principio\nd.appendleft(0)\nd.appendleft(-1)\n\nprint(d)  # deque([-1, 0, 1, 2, 3])\n\n# Eliminamos elementos del final y del principio\nprint(d.pop()) # 3\nprint(d.popleft()) # -1\n\nprint(d) # deque([0, 1, 2])<\/code><\/pre>\n\n\n\n<p><strong><code>deque<\/code> <\/strong>es perfecto para implementar colas, pilas y otros algoritmos que requieren inserciones\/eliminaciones eficientes en ambos extremos.<\/p>\n\n\n\n<p><strong>Contando Ocurrencias (Counter)<\/strong> <\/p>\n\n\n\n<p>A veces necesitas contar cu\u00e1ntas veces aparece cada elemento en una secuencia. <strong><code>Counter<\/code> <\/strong>simplifica esta tarea al crear un diccionario donde las claves son los elementos y los valores son la suma de veces.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># Creamos un Counter a partir de una lista\nmi_lista = ['a', 'b', 'c', 'a', 'b', 'a']\ncontador = collections.Counter(mi_lista)\n\nprint(contador)  # Counter({'a': 3, 'b': 2, 'c': 1})\n\n# Accedemos al conteo de un elemento espec\u00edfico\nprint(contador['a']) # 3\n\n# Obtener los elementos m\u00e1s comunes\nprint(contador.most_common(2))  # [('a', 3), ('b', 2)]\n\n# Obtenemos los elementos clave, valor\nfor x,y in contador.items():\n    print(x,y)\n<\/code><\/pre>\n\n\n\n<p><strong><code>Counter<\/code> <\/strong>es muy \u00fatil para analizar datos o encontrar las palabras m\u00e1s frecuentes en un texto .<\/p>\n\n\n\n<p><strong>Diccionarios con Orden Garantizado (OrderedDict)<\/strong><\/p>\n\n\n\n<p>En versiones anteriores a Python 3.7, los diccionarios no garantizaban el orden de inserci\u00f3n. <strong><code>OrderedDict<\/code> <\/strong>manten\u00eda el orden en que se insertaron las claves. A partir de Python 3.7, los diccionarios est\u00e1ndar conservan el orden de inserci\u00f3n, por lo que <strong><code>OrderedDict<\/code> <\/strong>es menos crucial, pero a\u00fan puede ser \u00fatil para compatibilidad con versiones anteriores o cuando necesitas funcionalidades espec\u00edficas relacionadas con el orden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># Creamos un OrderedDict\nod = collections.OrderedDict()\n\n# Insertamos elementos\nod['a'] = 1\nod['b'] = 2\nod['c'] = 3\n\n# Iteramos sobre las claves en el orden de inserci\u00f3n\nfor clave, valor in od.items():\n    print(clave, valor)  # Output: a 1, b 2, c 3<\/code><\/pre>\n\n\n\n<p><strong>Diccionarios con Valores Predeterminados (defaultdict)<\/strong><\/p>\n\n\n\n<p><strong><code>defaultdict<\/code> <\/strong>es un diccionario que proporciona un valor predeterminado para las claves que a\u00fan no existen. Esto evita errores <strong><code>KeyError<\/code> <\/strong>cuando intentas acceder a una clave inexistente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># Creamos un defaultdict con el tipo int como valor predeterminado (inicializado a 0)\nmi_defaultdict = collections.defaultdict(int)\n\n# Incrementamos el conteo de 'a'\nmi_defaultdict['a'] += 1\n\n# Intentar acceder a una clave inexistente no genera un error\nprint(mi_defaultdict['b'])  # 0 (el valor predeterminado es 0)<\/code><\/pre>\n\n\n\n<p><strong><code>defaultdict<\/code> <\/strong>simplifica el c\u00f3digo al eliminar la necesidad de verificar si una clave existe antes de acceder o modificar su valor. Es especialmente \u00fatil para contar elementos, agrupar datos y construir estructuras de datos complejas.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Python es conocido por su legibilidad y versatilidad. Si bien las listas (list) y los diccionarios (dict) son estructuras de &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,4],"tags":[173,176,178,175,174,177,2,168],"class_list":["post-461","post","type-post","status-publish","format-standard","hentry","category-colecciones-de-datos","category-python","tag-collections","tag-counter","tag-defaultdict","tag-deque","tag-namedtuple","tag-ordereddict","tag-python","tag-python-3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=461"}],"version-history":[{"count":7,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/461\/revisions"}],"predecessor-version":[{"id":469,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/461\/revisions\/469"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}