python: lista vs tupla, ¿cuándo usar cada una? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En Python, ¿cuándo se deben 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 yo soy el que diseña la API y consigue elegir los tipos de datos, entonces, ¿cuáles son las directrices?

Author: flybywire, 2009-11-10

7 answers

Hay una fuerte cultura de tuplas para colecciones heterogéneas, similar a lo que usarías structs para en C, y listas para colecciones homogéneas, similar a lo que usarías matrices para. Pero nunca he cuadrado esto con el tema 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 impone, y por lo tanto parece ser una distinción mucho menos interesante.

 190
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-14 12:36:13

Las tuplas son de tamaño fijo en la naturaleza, mientras que las listas son dinámicas.
En otras palabras, a tuplees inmutable mientras que a listes mutable.

  1. No se pueden añadir elementos a una tupla. Las tuplas no tienen el método append o extend.
  2. No se pueden eliminar elementos de una tupla. Las tuplas no tienen el método remove 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 compruebe 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 iterar a través de él, 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 afirmación implícita de que estos datos son constantes y que el pensamiento especial (y una función específica) se requiere para anular eso.

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

Fuente: Sumérgete en Python 3

 555
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-04 05:19:51

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

Por lo tanto, tiendo a hacer mis tuplas cosas que no deben cambiar después de la asignación y mis listas de cosas que pueden.

 75
Author: thornomad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-10 15:19:33

Debe ser mutable? Usa una lista. Que no debe ser mutable? Usa una tupla.

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

Para 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 llamadas.

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

 35
Author: AFoglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-10 15:01:14

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. Esto también significa que las tuplas se pueden usar para las claves del diccionario, mientras que las listas no.

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 un juego elige tu propia aventura, elegí usar tuplas en lugar de listas porque la posición en tuple fue significativo. 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 opción y esto es consistente para todas las páginas.

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

También echa un vistazo a los capítulos sobre listas y tuplas en Piensa en Python.

 11
Author: Amanda Nyren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-10 16:06:02

Pero si yo soy el que 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 haga lo que necesita. Rara vez es solo una tupla o lista - más a menudo es secuencia, cortable o incluso iterable. El duck typing de Python generalmente lo 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 se producen (parámetros de salida) simplemente devuelva lo que sea más conveniente para usted, por ejemplo, devuelva cualquier tipo de datos que mantenga o lo que devuelva su función auxiliar.

Una cosa a tener en cuenta es evitar devolver una lista (o cualquier otra 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
 9
Author: Rafał Dowgird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-10 15:46:15

Una ventaja menor pero notable de una lista sobre una tupla es que las listas tienden a ser ligeramente más portátiles. Es menos probable que las herramientas estándar admitan tuplas. JSON, por ejemplo, no tiene un tipo de tupla. YAML lo hace, pero su sintaxis es fea en comparación con su sintaxis de lista, que es bastante agradable.

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

 2
Author: Doug F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 21:05:07