538 votes

Liste ou tuple, quand les utiliser ?

En Python, quand faut-il utiliser des listes et quand des tuples ?

Parfois, vous n'avez pas le choix, par exemple si vous avez

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

alors x doit être un tuple.

Mais si c'est moi qui conçoit l'API et qui choisit les types de données, quelles sont les directives ?

30 votes

Malheureusement, cette question a été marquée à tort comme un doublon. L'une des principales raisons pour lesquelles vous verrez souvent des listes être utilisées au lieu de tuples dans des situations où il n'y a pas de raisons fortes pour l'une ou l'autre est la lisibilité. Les accolades sont utilisées pour de nombreuses choses en Python, mais les crochets ne sont utilisés que pour les choses liées aux listes. Par exemple, lorsqu'on passe une liste en argument, c'est tellement plus facile à repérer que lorsqu'on passe un tuple : my_func([e1, e2]) vs my_func((e1, e2))

863voto

jldupont Points 31331

Tuples sont de taille fixe par nature alors que listes sont dynamiques.
En d'autres termes, un tuple es immuable alors qu'un list es mutable .

  1. Vous ne pouvez pas ajouter d'éléments à un tuple. Les tuples n'ont pas de méthode append ou extend.
  2. Vous ne pouvez pas supprimer des éléments d'un tuple. Les tuples n'ont pas de méthode remove ou pop.
  3. Vous pouvez trouver des éléments dans un tuple, puisque cela ne modifie pas le tuple.
  4. Vous pouvez également utiliser le in pour vérifier si un élément existe dans le tuple.

  • Les tuples sont plus rapides que les listes. Si vous définissez un ensemble constant de valeurs et que vous n'avez pas l'intention d'en faire autre chose que de les parcourir, utilisez un tuple plutôt qu'une liste.

  • Votre code est plus sûr si vous "protégez en écriture" les données qui ne doivent pas être modifiées. Utiliser un tuple au lieu d'une liste revient à avoir une déclaration d'assertion implicite selon laquelle ces données sont constantes, et qu'une réflexion particulière (et une fonction spécifique) est nécessaire pour passer outre.

  • Certains tuples peuvent être utilisés comme clés de dictionnaire (en particulier, les tuples qui contiennent des valeurs immuables comme les chaînes de caractères, les nombres et d'autres tuples). Les listes ne peuvent jamais être utilisées comme clés de dictionnaire, car elles ne sont pas immuables.

Fuente: Plongez dans Python 3

64 votes

L'analogie avec la "protection en écriture" ne va pas plus loin : l'appartenance d'un tuple ne peut pas être modifiée. mais éléments mutables d'un tuple peut être modifié : l = list() ; t = (l, l) ; l.append(1)

14 votes

Qu'est-ce qui vous fait penser que les tuples sont plus rapides que les listes ?

3 votes

Les tuples ne sont pas plus rapides que les listes. In [220] : t_range = tuple(range(100000)) In [221] : 99999 in t_range Out[221] : True In [222] : l_range = range(100000) In [223] : 99999 in l_range Out[223] : True In [224] : %%timeit ..... : 99999 dans l_range ..... : 100 boucles, meilleur de 3 : 2.97 ms par boucle In [225] : %%timeit ..... : 99999 dans t_range ..... : 100 boucles, meilleur de 3 : 3.01 ms par boucle

268voto

Ned Batchelder Points 128913

Il y a une forte culture des tuples pour les collections hétérogènes, similaire à ce que vous utiliseriez struct Les listes sont destinées à des collections homogènes, similaires à celles des tableaux. Mais je n'ai jamais réussi à concilier cela avec le problème de mutabilité mentionné dans les autres réponses. La mutabilité a des dents (vous ne pouvez pas changer un tuple), alors que l'homogénéité n'est pas appliquée, et semble donc être une distinction beaucoup moins intéressante.

4 votes

@Ned alors, disons que vous voulez implémenter une classe Point. Utiliseriez-vous un tuple ou une liste pour contenir les coordonnées x, y, z ? Vous voudriez pouvoir changer les valeurs (avec une liste), mais en même temps l'ordre et la position sont significatifs et cohérents (avec un tuple ?).

60 votes

Vous passez à côté de la sémantique de la chose en la comparant à la mauvaise caractéristique de l'appareil. struct . Les tuples sont utiles lorsque la position est pertinente - Le meilleur exemple vient des coordonnées en mathématiques, qui utilisent même la même syntaxe : (x, y, z)

2 votes

Mis à part la mutabilité, pourquoi n'utilisons-nous pas toujours des dicts au lieu de tuples ? Cela aurait l'avantage de nommer les champs, ce qui rendrait l'accès aux éléments individuels beaucoup plus lisible...

89voto

thornomad Points 2278

Je pense (et je ne suis pas très au fait de Python) que la principale différence est qu'un tuple est immuable (il ne peut pas être modifié en place après l'affectation) et une liste est mutable (vous pouvez ajouter, modifier, soustraire, etc.).

J'ai donc tendance à faire de mes tuples des choses qui ne doivent pas changer après l'affectation et de mes listes des choses qui peuvent changer.

5 votes

Eh bien, pourquoi ne pas utiliser une liste même si vous ne prévoyez pas de muter ?

3 votes

@KalEl Quelques-unes des autres réponses à cet article expliquent pourquoi on peut choisir d'utiliser un tuple plutôt qu'une liste.

53voto

AFoglia Points 3791

Doit-il être mutable ? Utilisez une liste. Ne doit-il pas être mutable ? Utilisez un tuple.

Sinon, c'est une question de choix.

Pour les collections d'objets hétérogènes (comme une adresse décomposée en nom, rue, ville, état et code postal), je préfère utiliser un tuple. Ils peuvent toujours être facilement promus en tuples nommés .

De même, si la collection est destinée à être itérée, je préfère une liste. Si c'est juste un conteneur pour contenir plusieurs objets en un seul, je préfère un tuple.

3 votes

C'est la seule bonne réponse ici. Elle énonce la vérité, et pas seulement les trucs mutables/immuables que tout le monde connaît.

6 votes

Pourquoi utiliser un tuple, et même un tuple nommé, au lieu d'un dict ?

3 votes

Une justification des préférences serait appréciable. Pourquoi préférez-vous les tuples pour les objets hétérogènes ? Pourquoi préférez-vous une liste si vous voulez itérer ?

19voto

Amanda Nyren Points 189

La première chose à faire est de décider si la structure de données doit être mutable ou non. Comme il a été mentionné, les listes sont mutables, les tuples ne le sont pas. Cela signifie également que les tuples peuvent être utilisés comme clés de dictionnaire, alors que les listes ne le peuvent pas.

D'après mon expérience, les tuples sont généralement utilisés lorsque l'ordre et la position sont significatifs et cohérents. Par exemple, en créant une structure de données pour un jeu de type "choisissez votre propre aventure", j'ai choisi d'utiliser des tuples plutôt que des listes parce que la position dans le tuple était significative. Voici un exemple de cette structure de données :

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

La première position dans le tuple est le choix affiché à l'utilisateur lorsqu'il joue le jeu et la deuxième position est la clé de la page à laquelle ce choix mène et ceci est cohérent pour toutes les pages.

Les tuples sont également plus efficaces en termes de mémoire que les listes, bien que je ne sache pas exactement quand cet avantage devient apparent.

Consultez également les chapitres consacrés aux listes et aux tuples dans le document Pensez Python .

1 votes

Qu'est-ce qui vous fait penser que les tuples sont plus efficaces en mémoire que les listes ?

5 votes

+1 - bien que la mutabilité/immutabilité soit une considération importante, la position ayant une pertinence est el raison principale - les mathématiques utilisent même la même syntaxe pour les systèmes de coordonnées : (x, y, z)

0 votes

Pourquoi n'utilisez-vous pas les dicts au lieu des tuples, qui ont des entrées nommées ? Je ne comprends pas pourquoi la position est importante dans votre cas : l'un est l'action, l'autre est le résultat ... comment pourrais-je (le lecteur) savoir à l'avance que c'est l'ordre de ces choses ? Dans votre cas, c'est discutable, mais je vois beaucoup de tuples plus larges utilisés où leur accès devient next_thing = result_tuple[5] . 5 ? Vraiment ? Pourquoi 5 ? Ne serait-il pas mieux de dire next_thing = result['next_item'] ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X