python: list vs tuple, ¿cuándo usar cada uno?

En Python, ¿cuándo deberías usar listas y cuándo tuplas?

A veces no tienes opción, por ejemplo, si tienes

"hello %s you are %s years old" % x 

entonces x debe ser una tupla.

Pero si soy yo quien diseña la API y elige los tipos de datos, ¿cuáles son las pautas?

Existe una sólida cultura de tuplas para colecciones heterogéneas, similar a lo que usaría struct s en C, y listas para colecciones homogéneas, similares a las que usaría matrices. Pero nunca he cuadrado esto con el problema de mutabilidad mencionado en las otras respuestas. La mutabilidad tiene dientes (en realidad no se puede cambiar una tupla), mientras que la homogeneidad no se aplica, por lo que parece ser una distinción mucho menos interesante.

Las tuplas son de tamaño fijo en la naturaleza, mientras que las listas son dinámicas.
En otras palabras, una tuple es inmutable mientras que una list es mutable .

  1. No puedes agregar elementos a una tupla. Las tuplas no tienen método de añadir o extender.
  2. No puedes eliminar elementos de una tupla. Las tuplas no tienen método de quitar o pop
  3. Puede encontrar elementos en una tupla, ya que esto no cambia la tupla.
  4. También puede usar el operador in para verificar si existe un elemento en la tupla.

  • Las tuplas son más rápidas que las listas. Si está definiendo un conjunto constante de valores y todo lo que va a hacer con él es iterarlo, use una tupla en lugar de una lista.

  • Hace que su código sea más seguro si “protege contra escritura” los datos que no necesitan ser cambiados. Usar una tupla en lugar de una lista es como tener una statement de afirmación implícita de que estos datos son constantes y que se requiere un pensamiento especial (y una función específica) para anular esa información.

  • Algunas tuplas se pueden usar como claves de diccionario (específicamente, tuplas que contienen valores inmutables como cadenas, números y otras tuplas). Las listas nunca pueden usarse como claves de diccionario, porque las listas no son inmutables.

Fuente: Dive into Python 3

Creo (y apenas estoy bien versado en Python) que la principal diferencia es que una tupla es inmutable (no se puede cambiar en el lugar después de la asignación) y una lista es mutable (se puede agregar, cambiar, restar, etc.) ).

Por lo tanto, tiendo a hacer cosas de mi tuplas que no deberían cambiar después de la asignación y mi lista de cosas que pueden.

¿Debe ser mutable? Usa una lista. ¿No debe ser mutable? Utilice una tupla.

De lo contrario, es una cuestión de elección.

Para las colecciones de objetos heterogéneos (como una dirección dividida en nombre, calle, ciudad, estado y código postal), prefiero usar una tupla. Siempre pueden ser fácilmente promovidos a tuplas con nombre .

Del mismo modo, si la colección va a ser iterada, prefiero una lista. Si solo es un contenedor para contener varios objetos como uno, prefiero una tupla.

Lo primero que debe decidir es si la estructura de datos debe ser mutable o no. Como se ha mencionado, las listas son mutables, las tuplas no lo son. Esto también significa que las tuplas se pueden usar para las claves del diccionario, mientras que las listas no pueden.

En mi experiencia, las tuplas se usan generalmente donde el orden y la posición son significativos y consistentes. Por ejemplo, al crear una estructura de datos para elegir tu propio juego de aventuras, elegí usar tuplas en lugar de listas porque la posición en la tupla era significativa. Aquí hay un ejemplo de esa estructura de datos:

 pages = {'foyer': {'text' : "some text", 'choices' : [('open the door', 'rainbow'), ('go left into the kitchen', 'bottomless pit'), ('stay put','foyer2')]},} 

La primera posición en la tupla es la opción que se muestra al usuario cuando juega el juego y la segunda posición es la clave de la página a la que va la elección y esto es consistente para todas las páginas.

Las tuplas también son más eficientes con la memoria que las listas, aunque no estoy seguro de cuándo se hará evidente ese beneficio.

También puedes ver los capítulos sobre listas y tuplas en Think Python .

Pero si soy yo quien diseña la API y elige los tipos de datos, ¿cuáles son las pautas?

Para los parámetros de entrada, es mejor aceptar la interfaz más genérica que hace lo que necesita. Rara vez es solo una tupla o una lista; más a menudo es una secuencia, se puede cortar o incluso iterar. La tipificación de pato de Python generalmente se obtiene de forma gratuita, a menos que verifique explícitamente los tipos de entrada. No hagas eso a menos que sea absolutamente inevitable.

Para los datos que produce (parámetros de salida), devuelva lo que sea más conveniente para usted, por ejemplo, devuelva el tipo de datos que conserva o lo que devuelva su función auxiliar.

Una cosa a tener en cuenta es evitar devolver una lista (o cualquier otro objeto mutable) que sea parte de su estado, por ejemplo,

 class ThingsKeeper def __init__(self): self.__things = [] def things(self): return self.__things #outside objects can now modify your state def safer(self): return self.__things[:] #it's copy-on-write, shouldn't hurt performance 

Una ventaja menor pero notable de una lista sobre una tupla es que las listas tienden a ser un poco más portátiles. Las herramientas estándar tienen menos probabilidades de soportar tuplas. JSON, por ejemplo, no tiene un tipo de tupla. YAML lo hace, pero su syntax es fea en comparación con su syntax de lista, lo cual es bastante bueno.

En esos casos, es posible que desee utilizar una tupla internamente y luego convertirla a la lista como parte de un proceso de exportación. Alternativamente, es posible que desee utilizar listas en todas partes para mantener la coherencia.