web-dev-qa-db-fra.com

En Python, quand utiliser un dictionnaire, une liste ou un ensemble?

Quand devrais-je utiliser un dictionnaire, une liste ou un ensemble?

Existe-t-il des scénarios plus adaptés à chaque type de données?

260
Blankman

Un list garde l'ordre, dict et set pas: lorsque vous tenez à l'ordre, vous devez donc utiliser list (si votre choix de conteneurs est limité à ces trois, bien sûr ;-).

dict associe à chaque clé une valeur, alors que list et set ne contiennent que des valeurs: des cas d'utilisation très différents, évidemment.

set exige que les éléments soient hashable, list ne fait pas: si vous avez des éléments non-hashable, vous ne pouvez donc pas utiliser set et devez plutôt utiliser list.

set interdit les doublons, list ne le fait pas: c'est aussi une distinction cruciale. (Un "multiset", qui mappe les doublons en un nombre différent pour les éléments présents plusieurs fois, peut être trouvé dans collections.Counter - vous pouvez en créer un en tant que dict, si pour une raison étrange vous ne pouviez pas importer collections, ou, dans Python antérieur à 2.7 en tant que collections.defaultdict(int), en utilisant les éléments en tant que clés et la valeur associée en tant que nombre).

Vérifier l'appartenance à une valeur dans une set (ou dict, pour les clés) est extrêmement rapide (prenant environ un temps constant), alors que dans une liste, cela prend du temps proportionnellement à la longueur de la liste dans les cas les plus graves. Ainsi, si vous avez des éléments pouvant être remplacés, que vous fassiez attention à la commande ou aux doublons et que vous souhaitiez vérifier rapidement votre statut de membre, set est meilleur que list.

559
Alex Martelli
  • Avez-vous juste besoin d'une séquence ordonnée d'éléments? Aller pour une liste.
  • Avez-vous simplement besoin de savoir si vous avez déjà obtenu une valeur particulière, mais sans passer commande (et vous n'avez pas besoin de stocker des doublons)? Utilisez un ensemble.
  • Avez-vous besoin d'associer des valeurs à des clés pour pouvoir les rechercher efficacement (par clé) ultérieurement? Utilise un dictionnaire.
148
Jon Skeet
  • Utilisez un dictionnaire lorsque vous disposez d'un ensemble de clés uniques mappées sur des valeurs.

  • Utilisez une liste si vous avez une collection ordonnée d’articles.

  • Utilisez un ensemble pour stocker un ensemble d'éléments non ordonné.

18
SLaks

Lorsque vous voulez une collection non ordonnée d’éléments uniques, utilisez une set. (Par exemple, lorsque vous souhaitez utiliser l'ensemble des mots utilisés dans un document).

Lorsque vous souhaitez collecter une liste d'éléments immuables, utilisez un Tuple. (Par exemple, lorsque vous souhaitez utiliser une paire (nom, numéro de téléphone) que vous souhaitez utiliser comme élément d'un ensemble, vous avez besoin d'un tuple plutôt que d'une liste, car les éléments doivent être immuables).

Lorsque vous souhaitez collecter une liste d'éléments mutable ordonnée, utilisez un list. (Par exemple, lorsque vous souhaitez ajouter de nouveaux numéros de téléphone à une liste: [numéro1, numéro2, ...]).

Lorsque vous souhaitez associer des clés à des valeurs, utilisez une dict. (Par exemple, lorsque vous souhaitez un répertoire téléphonique qui mappe les noms sur des numéros de téléphone: {'John Smith' : '555-1212'}). Notez que les clés d'un dict ne sont pas ordonnées. (Si vous parcourez un dict (répertoire téléphonique), les touches (noms) peuvent apparaître dans n'importe quel ordre).

17
unutbu

Bien que cela ne couvre pas sets, c'est une bonne explication de dicts et lists:

Les listes sont ce qu'elles semblent être - une liste de valeurs. Chacun d'entre eux est numéroté, à partir de zéro - le premier est numéroté zéro, le second 1, le second 2, etc. Vous pouvez supprimer des valeurs de la liste et ajouter de nouvelles valeurs à la fin. Exemple: Nom de vos nombreux chats.

Les dictionnaires ressemblent à ce que leur nom suggère - un dictionnaire . Dans un dictionnaire, vous avez un "index" de mots, et pour chacun d'eux un définition. En python, le mot s'appelle une 'clé' et la définition une valeur'. Les valeurs dans un dictionnaire ne sont pas numérotées - la tare est similaire à ce que leur nom suggère - un dictionnaire. Dans un dictionnaire, vous avez un "index" de mots, et pour chacun d'eux une définition. Les valeurs dans un dictionnaire ne sont pas numérotés - ils ne sont pas dans un ordre spécifique, soit la clé fait la même chose. Vous pouvez ajouter, supprimer et modifier les valeurs dans les dictionnaires. Exemple: annuaire téléphonique.

http://www.sthurlow.com/python/lesson06/

5
Goose

Lorsque je les utilise, je fais une feuille de triche exhaustive de leurs méthodes pour votre référence:

class ContainerMethods:
    def __init__(self):
        self.list_methods_11 = {
                    'Add':{'append','extend','insert'},
                    'Subtract':{'pop','remove'},
                    'Sort':{'reverse', 'sort'},
                    'Search':{'count', 'index'},
                    'Entire':{'clear','copy'},
                            }
        self.Tuple_methods_2 = {'Search':'count','index'}

        self.dict_methods_11 = {
                    'Views':{'keys', 'values', 'items'},
                    'Add':{'update'},
                    'Subtract':{'pop', 'popitem',},
                    'Extract':{'get','setdefault',},
                    'Entire':{ 'clear', 'copy','fromkeys'},
                            }
        self.set_methods_17 ={
                    'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
                    'Subtract':{'pop', 'remove','discard'},
                    'Relation':{'isdisjoint', 'issubset', 'issuperset'},
                    'operation':{'union' 'intersection','difference', 'symmetric_difference'}
                    'Entire':{'clear', 'copy'}}
1
JawSaw

En bref, utilisez:

list - si vous avez besoin d'une séquence ordonnée d'éléments.

dict - si vous devez associer des valeurs avec des clés

set - si vous souhaitez conserver des éléments uniques.

Explication détaillée

Liste

Une liste est une séquence modifiable, généralement utilisée pour stocker des collections d'éléments homogènes.

Une liste implémente toutes les opérations de séquence courantes:

  • x in l et x not in l
  • l[i], l[i:j], l[i:j:k]
  • len(l), min(l), max(l)
  • l.count(x)
  • l.index(x[, i[, j]]) - index de la 1ère occurrence de x dans l (à ou après i et avant j indeces)

Une liste implémente également toutes les opérations de séquence modifiables:

  • l[i] = x - l'élément i sur l est remplacé par x
  • l[i:j] = t - la tranche de l de i à j est remplacée par le contenu de l'itérable t
  • del l[i:j] - identique à l[i:j] = []
  • l[i:j:k] = t - les éléments de l[i:j:k] sont remplacés par ceux de t
  • del l[i:j:k] - supprime les éléments de s[i:j:k] de la liste
  • l.append(x) - ajoute x à la fin de la séquence
  • l.clear() - supprime tous les éléments de l (identique à del l[:])
  • l.copy() - crée une copie superficielle de l (identique à l[:])
  • l.extend(t) ou l += t - étend l avec le contenu de t
  • l *= n - met à jour l avec son contenu répété n fois
  • l.insert(i, x) - insère x dans l à l'index donné par i
  • l.pop([i]) - récupère l'élément à i et le supprime également de l
  • l.remove(x) - supprime le premier élément de ll[i] est égal à x
  • l.reverse() - inverse les éléments de l en place

Une liste peut être utilisée en tant que pile en tirant parti des méthodes append et pop.

Dictionnaire

Un dictionnaire mappe les valeurs haschables à des objets arbitraires. Un dictionnaire est un objet mutable. Les opérations principales sur un dictionnaire stockent une valeur avec une clé et extraient la valeur donnée à la clé.

Dans un dictionnaire, vous ne pouvez pas utiliser comme clés des valeurs qui ne sont pas haschables, c'est-à-dire des valeurs contenant des listes, des dictionnaires ou d'autres types mutables.

Ensemble

Un ensemble est une collection non ordonnée d'objets distincts pouvant être séparés. Un ensemble est couramment utilisé pour inclure le test d'adhésion, l'élimination des doublons d'une séquence et le calcul d'opérations mathématiques telles que l'intersection, l'union, la différence et la différence symétrique.

1
lmiguelvargasf

En combinaison avec lists, dicts et sets, il existe également un autre objet python intéressant, OrderedDicts

Les dictionnaires ordonnés sont comme les dictionnaires ordinaires, mais ils se souviennent de l'ordre dans lequel les éléments ont été insérés. Lors d'une itération sur un dictionnaire commandé, les éléments sont renvoyés dans l'ordre dans lequel leurs clés ont été ajoutées.

OrderedDicts peut être utile lorsque vous devez conserver l'ordre des clés, par exemple lorsque vous travaillez avec des documents: il est courant d'avoir besoin de la représentation vectorielle de tous les termes d'un document. Donc, en utilisant OrderedDicts, vous pouvez vérifier efficacement si un terme a été lu avant, ajouter des termes, extraire des termes et, après toutes les manipulations, vous pouvez en extraire la représentation vectorielle ordonnée.

0
Federico Caccia

Les listes sont ce qu'elles semblent être - une liste de valeurs. Chacun d'entre eux est numéroté, en commençant par zéro - le premier est numéroté, le second 1, le troisième 2, etc. Vous pouvez supprimer des valeurs de la liste et ajouter de nouvelles valeurs à la fin. Exemple: Nom de vos nombreux chats.

Tuples sont comme des listes, mais vous ne pouvez pas changer leurs valeurs. Les valeurs que vous indiquez en premier sont les valeurs avec lesquelles vous êtes bloqués pour le reste du programme. Encore une fois, chaque valeur est numérotée à partir de zéro pour faciliter la référence. Exemple: les noms des mois de l'année.

Dictionnaires sont similaires à ce que leur nom suggère - un dictionnaire. Dans un dictionnaire, vous avez un "index" de mots, et pour chacun d'eux une définition. En python, le mot s'appelle une "clé" et la définition, une "valeur". Les valeurs dans un dictionnaire ne sont pas numérotées - une tare semblable à celle suggérée par leur nom - un dictionnaire. Dans un dictionnaire, vous avez un "index" de mots, et pour chacun d'eux une définition. En python, le mot s'appelle une "clé" et la définition, une "valeur". Les valeurs d'un dictionnaire ne sont pas numérotées - elles ne sont pas non plus dans un ordre spécifique - la clé fait la même chose. Vous pouvez ajouter, supprimer et modifier les valeurs dans les dictionnaires. Exemple: annuaire téléphonique.

0
Nitish Kumar Pal

Pour C++, je pensais toujours à cet organigramme: Dans quel scénario dois-je utiliser un conteneur STL particulier? , j'étais donc curieux de savoir si quelque chose de similaire était disponible pour Python3 également, mais je n'ai pas eu de chance.

Ce que vous devez garder à l'esprit pour Python est le suivant: Il n'existe pas de norme Python identique à celle de C++. Il peut donc y avoir d’énormes différences entre les différents interprètes Python (par exemple, CPython, PyPy). L'organigramme suivant est pour CPython.

De plus, je n'ai trouvé aucun moyen d'intégrer les structures de données suivantes dans le diagramme: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter et arrays.

  • OrderedDict et deque sont disponibles via le module collections.
  • heapq est disponible à partir du module heapq
  • LifoQueue, Queue et PriorityQueue sont disponibles via le module queue qui est conçu pour un accès simultané (threads). (Il existe également un multiprocessing.Queue disponible, mais je ne connais pas les différences par rapport à queue.Queue, mais supposerais qu'il devrait être utilisé lorsqu'un accès simultané à partir de processus est nécessaire.)
  • dict, set, frozen_set et list sont bien entendu intégrés

Pour tout le monde, je serais reconnaissant si vous pouviez améliorer cette réponse et fournir un meilleur diagramme dans tous les aspects. Sentez-vous libre et bienvenue .  flowchart

PS: le schéma a été réalisé avec yed. Le fichier graphml est ici

0
math