Saltar al contenido

¿Por qué Python trata a las tuplas, listas, conjuntos y diccionarios como cosas fundamentalmente diferentes?

Laura, parte de este equipo de trabajo, nos hizo el favor de redactar este tutorial ya que controla muy bien este tema.

Solución:

tl; dr (tipificación de pato)

Tiene razón al ver algunas similitudes en todas estas estructuras de datos. Recuerda que Python usa la escritura de pato. (si parece un pato y grazna como un pato, entonces es un pato). Si puede usar dos objetos en la misma situación, entonces, para sus intenciones y propósitos actuales, también podrían ser del mismo tipo de datos. Pero siempre debes tener en cuenta que si intentas usarlos en otras situaciones, es posible que ya no se comporten de la misma manera.

Con esto en mente, deberíamos echar un vistazo a lo que es realmente diferente y lo mismo de los cuatro tipos de datos que mencionaste, para tener una idea general de las situaciones en las que son intercambiables.

Mutabilidad (¿puedes cambiarlo?)

Puede realizar cambios en diccionarios, listas y conjuntos. Las tuplas no se pueden “cambiar” sin hacer una copia.

  • Mudable: dict, list, set

    Inmutable: tuple

Pitón string también es un tipo inmutable. ¿Por qué queremos algunos objetos inmutables? Parafrasearía de esta respuesta:

  1. Los objetos inmutables se pueden optimizar mucho

  2. En Python, solo los inmutables son hash (y solo los objetos hash pueden ser miembros de conjuntos, o keys en diccionarios).

Al comparar esta propiedad, las listas y tuplas parecen los dos tipos de datos más “cercanos”. En un nivel alto, una tupla es una versión inmutable de “cuadro congelado” de una lista. Esto hace que las listas sean útiles para conjuntos de datos que cambiarán con el tiempo (ya que no es necesario copiar una lista para modificarla), pero las tuplas son útiles para cosas como el diccionario. keys (que deben ser tipos inmutables).

Ordenar (y una nota sobre tipos de datos abstractos)

Un diccionario, como un conjunto, no tiene un orden conceptual inherente. Esto contrasta con las listas y tuplas, que tienen un orden. El orden de los elementos de un dict o un conjunto es abstraído lejos del programador, lo que significa que si el elemento A viene antes que B en un for k in mydata bucle, no debe (y generalmente no puede) confiar en que A esté antes que B una vez que comience a hacer cambios en mydata.

  • Conservación de pedidos: list, tuple

    Sin conservación del orden: dict, set

Técnicamente, si repites mydata dos veces seguidas estará en el mismo orden, pero esta es una característica más conveniente de la mecánica de Python, y no realmente una parte de la settipo de datos abstracto (la definición matemática del tipo de datos). Sin embargo, las listas y tuplas garantizan el orden, especialmente las tuplas que son inmutables.

Lo que ves cuando iteras (si camina como un pato …)

  • Un “artículo” por “elemento”: set, list, tuple

    Dos “elementos” por “elemento”: dict

Supongo que aquí podría ver una tupla con nombre, que tiene un nombre y un valor para cada elemento, como un análogo inmutable de un diccionario. Pero esta es una comparación tenue; tenga en cuenta que la escritura de pato causará problemas si está tratando de usar un método de solo diccionario en una tupla con nombre, o viceversa.

Respuestas directas a sus preguntas

¿No es un diccionario solo una lista de tuplas con una restricción de unicidad particular?

No, existen varias diferencias. Los diccionarios no tienen un orden inherente, que es diferente de una lista, que sí lo tiene.

Además, un diccionario tiene un key y un valor para cada “elemento”. Una tupla, por otro lado, puede tener un número arbitrario de elementos, pero cada uno con solo un valor.

Debido a la mecánica de un diccionario, donde keys actuar como un conjunto, puede buscar valores en tiempo constante si tiene el key. En una lista de tuplas (pares aquí), necesitaría iterar a través de la lista hasta que encuentre el key, lo que significa que la búsqueda sería lineal en el número de elementos de su lista.

Sin embargo, lo más importante es que los elementos del diccionario se pueden cambiar, mientras que las tuplas no.

¿No es una lista simplemente un conjunto con un tipo diferente de restricción de unicidad?

Una vez más, enfatizaría que los conjuntos no tienen un orden inherente, mientras que las listas sí. Esto hace que las listas sean mucho más útiles para representar cosas como pilas y colas, donde desea poder recordar el orden en el que agregó los elementos. Los juegos no ofrecen tal garantía. Sin embargo, ofrecen la ventaja de poder realizar búsquedas de membresía en un tiempo constante, mientras que nuevamente las listas toman un tiempo lineal.

Ahora hay tuplas con nombre, comenzando a parecer más un diccionario de casos especiales. Ahora hay diccionarios ordenados, comenzando a parecer más una lista. Y acabo de ver una receta para conjuntos ordenados. Puedo imaginarme esto sucediendo una y otra vez … ¿qué pasa con las listas únicas, etc.?

Hasta cierto punto estoy de acuerdo contigo. Sin embargo, las bibliotecas de estructuras de datos pueden ser útiles para admitir casos de uso comunes para estructuras de datos ya bien establecidas. Esto evita que el programador pierda tiempo intentando crear extensiones personalizadas para las estructuras estándar. Siempre que no se salga de control y podamos ver la utilidad única de cada solución, es bueno tener una rueda en el estante para no tener que reinventarla.

Un gran ejemplo es la clase Counter (). Este diccionario especializado me ha sido útil más veces de las que puedo contar (¡badoom-tshhhhh!) Y me ha ahorrado el esfuerzo de codificar una solución personalizada. Prefiero tener una solución que la comunidad me está ayudando a desarrollar y mantener con las mejores prácticas adecuadas de Python que algo que se encuentra en mi carpeta de estructuras de datos personalizadas y solo se usa una o dos veces al año.

Todos estos tipos de datos tienen diferentes propósitos y, en un mundo ideal, es posible que pueda unificarlos más. Sin embargo, en el mundo real necesitamos tener eficiente implementaciones de las colecciones básicas y, por ejemplo, el pedido agrega una penalización de tiempo de ejecución.

Las tuplas nombradas sirven principalmente para hacer que la interfaz de stat () y similares sean más utilizables, y también pueden ser agradables cuando se trata de conjuntos de filas SQL.

La gran unificación que está buscando está realmente ahí, en la forma de los diferentes protocolos de acceso (getitem, getattr, iter, …), que estos tipos mezclan y combinan para los propósitos previstos.

En primer lugar, los diccionarios ordenados y las tuplas con nombre se introdujeron en Python 2, pero eso no viene al caso.

No te señalaré los documentos ya que si estuvieras realmente interesado ya los habrías leído.

La primera diferencia entre los tipos de colecciones es la mutabilidad. tuple y frozenset son tipos inmutables. Esto significa que pueden ser más eficientes que list o set.

Si quieres algo a lo que puedas acceder de forma aleatoria o en orden, pero que principalmente cambiará al final, quieres un list. Si quieres algo que también puedes cambiar al principio, quieres un deque.

Simplemente no puedes tener tu pastel y comértelo también: cada característica que agregas te hace perder algo de velocidad.

dict y set son fundamentalmente diferentes de lists y tuplas`. Almacenan el hash de su keys, lo que le permite ver si un elemento está en ellos muy rápidamente, pero requiere la key ser hash. No obtiene la misma velocidad de prueba de membresía con listas o matrices vinculadas.

Cuando llegues a OrderedDict y NamedTuple, estás hablando de subclases de los tipos incorporados implementados en Python, en lugar de C. Son para casos especiales, al igual que cualquier otro código en la biblioteca estándar que tenga que importar. No abarrotan el espacio de nombres, pero es bueno tenerlos cuando los necesita.

Uno de estos días, estarás codificando y dirás: “Hombre, ahora sé exactamente lo que querían decir con ‘Debería haber una, y preferiblemente solo una, forma obvia de hacerlo’, una set es solo lo que necesitaba para esto, ¡estoy muy contento de que sea parte del lenguaje Python! Si tuviera que usar una lista, necesitaría para siempre. “Ahí es cuando comprenderá por qué existen estos tipos diferentes.

Si piensas que te ha resultado de ayuda nuestro artículo, nos gustaría que lo compartas con más programadores y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *