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

294

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

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

Blankman
la source

Réponses:

603

A listgarde l'ordre dictet setne le fait pas: lorsque vous vous souciez de la commande, vous devez donc utiliser list(si votre choix de conteneurs est limité à ces trois, bien sûr ;-).

dictassocie à chaque clé une valeur, tandis que listet setcontiennent juste des valeurs: cas d'utilisation très différents, évidemment.

setexige que les articles soient lavables, listnon: si vous avez des articles non lavables, vous ne pouvez donc pas les utiliser setet devez plutôt les utiliser list.

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

La vérification de l'appartenance d'une valeur à un set(ou dict, pour les clés) est incroyablement rapide (prenant environ un temps constant et court), tandis que dans une liste, cela prend du temps proportionnel à la longueur de la liste dans la moyenne et le pire des cas. Donc, si vous avez des articles lavables, ne vous souciez pas de la commande ou des doublons, et souhaitez une vérification rapide de l'adhésion, setc'est mieux que list.

Alex Martelli
la source
6
Notez que Python 3.7 a dicté l'ordre par défaut
Gigi Bayte 2
172
  • Avez-vous juste besoin d'une séquence d'articles commandée? Allez pour une liste.
  • Avez - vous juste besoin de savoir si vous avez déjà ou non obtenu une valeur particulière, mais sans ordre (et vous n'avez pas besoin de doublons de magasin)? 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.
Jon Skeet
la source
30
Cela devrait être la partie "TL; DR" à la réponse ci-dessus par Alex M. :-)
Alex Boschmans
9
Je pense que c'est l'inverse .. Alex devrait donner ses votes à Jon. Cette réponse couvre à peu près tout et elle est beaucoup plus concise et claire.
mehmet
si, cependant, vous aimez connaître la différence de complexité temporelle entre ces types de données, l'explication d'Alex fonctionne mieux
kcEmenike
19

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

Lorsque vous souhaitez collecter une liste d'éléments ordonnée immuable, utilisez a tuple. (Par exemple, lorsque vous voulez une paire (nom, numéro de téléphone) que vous souhaitez utiliser comme élément dans un ensemble, vous aurez besoin d'un tuple plutôt que d'une liste car les ensembles nécessitent que les éléments soient immuables).

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

Lorsque vous souhaitez un mappage des clés aux valeurs, utilisez a dict. (Par exemple, lorsque vous voulez un annuaire téléphonique qui mappe les noms aux 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 (annuaire téléphonique), les touches (noms) peuvent apparaître dans n'importe quel ordre).

unutbu
la source
Euh, il n'a pas posé de questions sur les tuples.
habnabit
18
  • Utilisez un dictionnaire lorsque vous disposez d'un ensemble de clés uniques qui correspondent aux valeurs.

  • Utilisez une liste si vous avez une collection d'articles commandée.

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

SLaks
la source
6

En bref, utilisez:

list - si vous avez besoin d'une séquence d'articles commandée.

dict - si vous souhaitez associer des valeurs à 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]])- indice de la 1ère occurrence de xin l(à ou après iet avant les jindécès)

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

  • l[i] = x- article ide lest remplacé parx
  • l[i:j] = t- tranche de lde ià jest remplacée par le contenu de l'itérablet
  • del l[i:j] - pareil que l[i:j] = []
  • l[i:j:k] = t- les éléments de l[i:j:k]sont remplacés par ceux det
  • 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(comme del l[:])
  • l.copy()- crée une copie superficielle de l(identique à l[:])
  • l.extend(t)ou l += t- s'étend lavec le contenu det
  • l *= n- met là jour son contenu plusieurs nfois
  • l.insert(i, x)- s'insère xdans ll'index donné pari
  • l.pop([i])- récupère l'élément à iet le supprime également del
  • l.remove(x)- supprimer le premier élément d' ll[i]est égal à x
  • l.reverse()- inverse les éléments len place

Une liste pourrait être utilisée comme pile en tirant parti des méthodes appendet pop.

dictionnaire

Un dictionnaire mappe des valeurs lavables à des objets arbitraires. Un dictionnaire est un objet modifiable. Les opérations principales sur un dictionnaire sont le stockage d'une valeur avec une clé et l'extraction de la valeur donnée la clé.

Dans un dictionnaire, vous ne pouvez pas utiliser comme clés des valeurs non hachables, 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 lavables distincts. Un ensemble est couramment utilisé pour inclure les tests d'appartenance, la suppression des doublons d'une séquence et le calcul des opérations mathématiques telles que l'intersection, l'union, la différence et la différence symétrique.

lmiguelvargasf
la source
5

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

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

Les 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 est appelé une «clé» et la définition une «valeur». Les valeurs d'un dictionnaire ne sont pas numérotées - elles 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. 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.

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

OIE
la source
4

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

Ce que vous devez garder à l'esprit pour Python est: Il n'y a pas de standard Python unique comme pour C ++. Par conséquent, il pourrait y avoir d'énormes différences pour différents interprètes Python (par exemple CPython, PyPy). L'organigramme suivant concerne CPython.

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

  • OrderedDictet dequesont disponibles via le collectionsmodule.
  • heapqest disponible depuis le heapqmodule
  • LifoQueue,, Queueet PriorityQueuesont disponibles via le queuemodule conçu pour un accès simultané (threads). (Il existe également une version multiprocessing.Queuedisponible, mais je ne connais pas les différences, queue.Queuemais supposerait qu'elle devrait être utilisée lorsqu'un accès simultané à partir de processus est nécessaire.)
  • dict, set, frozen_setEt listsont bien sûr builtin

Pour tous, je vous serais reconnaissant de bien vouloir améliorer cette réponse et de fournir un meilleur diagramme dans tous les aspects. N'hésitez pas et bienvenue. organigramme

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

mathématiques
la source
3

En combinaison avec des listes , des dict et des ensembles , il existe également un autre objet python intéressant, OrderedDicts .

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

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

Federico Caccia
la source
1

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

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

Les 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 est appelé une «clé» et la définition une «valeur». Les valeurs d'un dictionnaire ne sont pas numérotées - elles 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 est appelé 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.

Nitish Kumar Pal
la source
1

Lorsque vous les utilisez, 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'}}
Calcul
la source
1

Dictionnaire: un dictionnaire python est utilisé comme une table de hachage avec clé comme index et objet comme valeur.

Liste: une liste est utilisée pour contenir des objets dans un tableau indexé par la position de cet objet dans le tableau.

Ensemble: Un ensemble est une collection avec des fonctions qui peuvent dire si un objet est présent ou non dans l'ensemble.

Srinivas P
la source