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?
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
.
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é.
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).
Bien que cela ne couvre pas set
s, c'est une bonne explication de dict
s et list
s:
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.
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'}}
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.
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 listel.append(x)
- ajoute x
à la fin de la séquencel.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
foisl.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 l
où l[i]
est égal à xl.reverse()
- inverse les éléments de l
en placeUne liste peut être utilisée en tant que pile en tirant parti des méthodes append
et pop
.
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.
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.
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.
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.
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ésPour 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 .
PS: le schéma a été réalisé avec yed. Le fichier graphml est ici