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

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

y a-t-il des scénarios qui conviennent mieux à chaque type de données?

243
demandé sur Student 2010-08-16 00:22:32

9 réponses

Un list maintient de l'ordre", 151910920" et set n'est pas le cas: quand vous vous souciez de l'ordre, par conséquent, vous devez utiliser list (si votre choix de récipients est limitée à ces trois, bien sûr;-).

dict associe avec chaque touche une valeur, tandis que list et set contiennent simplement des valeurs: cas d'utilisation très différents, évidemment.

set exige que les éléments soient hachables, list ne l'est pas: si vous par conséquent, vous ne pouvez pas utiliser set et vous devez plutôt utiliser list .

set interdit les doublons, list ne fait pas: aussi une distinction cruciale. (Un "multiset", qui correspond à un nombre différent pour les éléments présents plus d'une fois , peut être trouvé dans collections.Counter -- vous pourriez en construire un comme un dict , si pour une raison étrange vous ne pouviez pas importer collections , ou , en pré-2.7 Python comme un collections.defaultdict(int) , en utilisant le les éléments clés et la valeur associée comme le comte).

vérifier l'appartenance d'une valeur dans un set (ou dict , pour les clés) est extrêmement rapide (prenant environ un temps constant, court), alors que dans une liste il faut du temps proportionnel à la longueur de la liste dans la moyenne et les pires cas. Donc, si vous avez des articles hachables, ne vous souciez pas de la commande ou des doublons, et que vous voulez une vérification rapide de l'adhésion, set est mieux que list .

534
répondu Alex Martelli 2010-08-15 20:30:13
  • avez-vous besoin d'une séquence ordonnée d'éléments? Aller pour une liste.
  • avez-vous juste besoin de savoir si oui ou non vous avez déjà obtenu une valeur particulière, mais sans commander (et vous n'avez pas besoin de stocker des doublons)? L'utilisation d'un ensemble.
  • avez-vous besoin d'associer des valeurs avec des clés, de sorte que vous pouvez les rechercher efficacement (par clé) plus tard? Utilisez un dictionnaire.
140
répondu Jon Skeet 2010-08-15 20:24:56
  • utilisez un dictionnaire lorsque vous avez un ensemble de clés uniques qui correspondent à des valeurs.

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

  • utiliser un ensemble pour stocker un ensemble d'articles non classés.

18
répondu SLaks 2010-08-15 20:25:49

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

si vous voulez collecter une liste d'éléments ordonnés immuables, utilisez un tuple . (Par exemple, lorsque vous voulez un (nom, phone_number) paire que vous souhaitez utiliser comme un élément dans un ensemble, vous auriez besoin d'un tuple, plutôt qu'une liste depuis le requièrent des éléments immuables).

quand vous souhaitez collecter une liste d'éléments mutables et ordonnés, utilisez un list . (Par exemple, lorsque vous souhaitez ajouter de nouveaux numéros de téléphone à une liste: [nombre1, nombre2, ...]).

si vous voulez un mappage des clés vers les valeurs, utilisez un dict . (Par exemple, lorsque vous voulez un annuaire téléphonique qui associe des 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 parcourir une dict (annuaire téléphonique), les clés (noms) peuvent apparaître dans n'importe quel ordre).

16
répondu unutbu 2012-11-09 13:31:16

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'eux est numérotés à partir de zéro - le premier est numéroté zéro, la seconde 1, le troisième 2, etc. Vous pouvez supprimer des valeurs de la liste, et ajouter de nouvelles valeurs à la fin. Exemple: vos nombreux noms de chats.

dictionnaires sont similaires à ce que leur nom suggère - un dictionnaire. Dans un dictionnaire, vous disposez d'un index de mots, et pour chacun d'eux une définition. En python, le mot est appelé "clé", et la définition une 'valeur'. Les valeurs dans un dictionnaire ne sont pas numérotées-tare similaire à ce que leur nom suggère-un dictionnaire. Dans un dictionnaire, vous avez un index des 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 particulier, la touche fonctionne de la même chose. Vous pouvez ajouter, supprimer et modifier des les valeurs dans les dictionnaires. Exemple: annuaire téléphonique.

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

5
répondu Goose 2015-08-19 18:43:01

quand je les utilise, je fais un cheatsheet exhaustif 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
répondu JawSaw 2017-12-06 11:06:52

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

Tuples sont comme des listes, mais vous ne pouvez pas changer leurs valeurs. Les valeurs que vous lui donnez d'abord, ce sont les valeurs que vous êtes coincé avec pour le reste du programme. Encore une fois, chaque valeur est numérotée à partir de zéro, pour faciliter la consultation. Exemple: les noms des mois de l'année.

dictionnaires sont similaires à ce que leur nom suggère - un dictionnaire. Dans un dictionnaire, vous disposez d'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 dans un dictionnaire ne sont pas numérotées-tare semblable à ce que leur nom suggère - un dictionnaire. Dans un dictionnaire, vous disposez d'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 dans un dictionnaire ne sont pas numérotés - ils ne sont pas dans un ordre particulier, la clé fait la même chose. Vous pouvez ajouter, supprimer et modifier les valeurs dans les dictionnaires. Exemple: annuaire téléphonique.

0
répondu Nitish Kumar Pal 2017-06-18 08:17:07

en combinaison avec listes , dicts et sets , il y a aussi un autre objet Python intéressant, OrderedDicts .

les dictionnaires commandés sont exactement comme les dictionnaires réguliers, mais ils se souviennent de l'ordre dans lequel les articles ont été insérés. Lors de l'itération sur un dictionnaire commandé, les éléments sont retournés dans l'ordre leurs clés ont été d'abord ajoutées.

OrderedDicts peut être utile lorsque vous avez besoin de préserver l'ordre des clés, par exemple en travaillant avec des documents: il est fréquent d'avoir besoin de la représentation vectorielle de tous les Termes dans un document. Ainsi 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 extraire la représentation vectorielle ordonnée d'eux.

0
répondu Federico Caccia 2018-05-08 15:25:43

pour C++ j'avais toujours cet organigramme à l'esprit: dans quel scénario est-ce que j'utilise un conteneur STL particulier? , donc j'étais curieux si quelque chose de similaire est disponible pour Python3 aussi, 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++. Il pourrait donc y avoir d'énormes différences entre les différents interprètes Python (par exemple, CPython, PyPy). L'organigramme suivant est pour CPython.

en outre, je n'ai trouvé aucune bonne façon 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 heapq module
  • LifoQueue , Queue , et PriorityQueue sont disponibles via le module queue qui est conçu pour l'accès simultané (threads). (Il y a aussi un multiprocessing.Queue disponible mais je ne sais pas les différences à queue.Queue mais supposerait qu'il devrait être utilisé lorsque l'accès simultané des processus est nécessaire.)
  • dict , set , frozen_set , et list sont bien sûr intégrés

pour n'importe qui je serais reconnaissant si vous pourrait améliorer cette réponse et fournir un meilleur diagramme dans chaque aspect. Se sentir libre et de bienvenue. flowchart

PS: le diagramme a été fait avec yed. Le fichier graphml est ici

0
répondu math 2018-08-31 08:01:44