Wann sollte in Python ein Wörterbuch, eine Liste oder ein Set verwendet werden?

294

Wann sollte ich ein Wörterbuch, eine Liste oder ein Set verwenden?

Gibt es Szenarien, die für jeden Datentyp besser geeignet sind?

Blankman
quelle

Antworten:

603

A listhält Ordnung dictund setnicht: Wenn Sie sich für Ordnung interessieren, müssen Sie diese verwenden list(wenn Ihre Auswahl an Behältern natürlich auf diese drei beschränkt ist ;-).

dictordnet jedem Schlüssel einen Wert zu, während listund setenthält nur Werte: offensichtlich sehr unterschiedliche Anwendungsfälle.

seterfordert, dass Elemente hashbar sind, listnicht: Wenn Sie nicht hashbare Elemente haben, können Sie diese nicht verwenden setund müssen sie stattdessen verwenden list.

setverbietet Duplikate, listnicht: auch eine entscheidende Unterscheidung. (Ein "Multiset", das Duplikate für mehr als einmal vorhandene Elemente einer anderen Anzahl zuordnet, befindet sich in collections.Counter- Sie können eines als dict, wenn Sie es aus irgendeinem seltsamen Grund nicht importieren konnten collections, oder in Version 2.7 erstellen Python als collections.defaultdict(int)(unter Verwendung der Elemente als Schlüssel und des zugehörigen Werts als Anzahl).

Das Überprüfen der Zugehörigkeit zu einem Wert in a set(oder dictnach Schlüsseln) ist blitzschnell (dauert ungefähr eine konstante, kurze Zeit), während es in einer Liste im Durchschnitt und im schlimmsten Fall Zeit kostet, die proportional zur Länge der Liste ist. Also, wenn Sie hashable Einzelteile haben, nicht so oder so über Bestellung oder Duplikate Pflege und schnelle Mitgliedschaft Prüfung wollen, setist besser als list.

Alex Martelli
quelle
6
Beachten Sie, dass Python 3.7 standardmäßig
diktiert
172
  • Benötigen Sie nur eine geordnete Abfolge von Artikeln? Gehen Sie für eine Liste.
  • Haben Sie muss nur wissen , ob Sie haben bereits bekommen einen bestimmten Wert, aber ohne Ordnung (und Sie nicht zum Speichern von Duplikaten müssen)? Verwenden Sie ein Set.
  • Müssen Sie Schlüssel mit Werten verknüpfen, damit Sie sie später effizient (nach Schlüssel) nachschlagen können? Benutze ein Wörterbuch.
Jon Skeet
quelle
30
Dies sollte der "TL; DR" Teil der obigen Antwort von Alex M. sein :-)
Alex Boschmans
9
Ich denke, es ist umgekehrt. Alex sollte seine Stimmen an Jon spenden. Diese Antwort deckt so ziemlich alles ab und ist viel prägnanter und klarer.
Mehmet
Wenn Sie jedoch den zeitlichen Komplexitätsunterschied zwischen diesen Datentypen kennen
möchten,
19

Wenn Sie eine ungeordnete Sammlung eindeutiger Elemente wünschen, verwenden Sie a set. (Zum Beispiel, wenn Sie alle Wörter in einem Dokument verwenden möchten).

Wenn Sie eine unveränderliche geordnete Liste von Elementen sammeln möchten, verwenden Sie a tuple. (Wenn Sie beispielsweise ein Paar (Name, Telefonnummer) möchten, das Sie als Element in einem Satz verwenden möchten, benötigen Sie ein Tupel anstelle einer Liste, da für Sätze Elemente unveränderlich sein müssen.)

Wenn Sie eine veränderbare geordnete Liste von Elementen sammeln möchten, verwenden Sie a list. (Wenn Sie beispielsweise neue Telefonnummern an eine Liste anhängen möchten: [Nummer1, Nummer2, ...]).

Wenn Sie eine Zuordnung von Schlüsseln zu Werten wünschen, verwenden Sie a dict. (Zum Beispiel, wenn Sie ein Telefonbuch möchten, das Namen Telefonnummern zuordnet :) {'John Smith' : '555-1212'}. Beachten Sie, dass die Tasten in einem Diktat ungeordnet sind. (Wenn Sie ein Diktat (Telefonbuch) durchlaufen, werden die Schlüssel (Namen) möglicherweise in beliebiger Reihenfolge angezeigt.)

unutbu
quelle
Äh, er hat nicht nach Tupeln gefragt.
Hablabit
18
  • Verwenden Sie ein Wörterbuch, wenn Sie über eine Reihe eindeutiger Schlüssel verfügen, die Werten zugeordnet sind.

  • Verwenden Sie eine Liste, wenn Sie eine bestellte Sammlung von Artikeln haben.

  • Verwenden Sie einen Satz, um einen ungeordneten Satz von Elementen zu speichern.

SLaks
quelle
6

Kurz gesagt, verwenden Sie:

list - wenn Sie eine geordnete Abfolge von Artikeln benötigen.

dict - wenn Sie Werte mit Schlüsseln verknüpfen müssen

set - wenn Sie eindeutige Elemente behalten möchten.

Ausführliche Erklärung

Aufführen

Eine Liste ist eine veränderbare Sequenz, die normalerweise zum Speichern von Sammlungen homogener Elemente verwendet wird.

Eine Liste implementiert alle gängigen Sequenzoperationen:

  • x in l und 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 des ersten Auftretens von xin l(bei oder nach iund vor jIndeces)

Eine Liste implementiert auch alle veränderlichen Sequenzoperationen:

  • l[i] = x- Artikel ivon lwird ersetzt durchx
  • l[i:j] = t- Scheibe von lvon ibis jwird durch den Inhalt der iterablen ersetztt
  • del l[i:j] - gleich wie l[i:j] = []
  • l[i:j:k] = t- Die Elemente von l[i:j:k]werden durch die von ersetztt
  • del l[i:j:k]- Entfernt die Elemente von s[i:j:k]aus der Liste
  • l.append(x)- wird xan das Ende der Sequenz angehängt
  • l.clear()- Entfernt alle Elemente aus l(wie del l[:])
  • l.copy()- erstellt eine flache Kopie von l(wie l[:])
  • l.extend(t)oder l += t- erstreckt sich lmit dem Inhalt vont
  • l *= n- Updates lmit seinem Inhalt wiederholt nZeiten
  • l.insert(i, x)- fügt xin lden voni
  • l.pop([i])- ruft das Objekt bei ab iund entfernt es auch vonl
  • l.remove(x)- Entfernen Sie das erste Element aus ldem l[i]gleich x
  • l.reverse()- kehrt die Gegenstände lan Ort und Stelle

Eine Liste könnte als Stapel verwendet werden, indem die Methoden appendund genutzt werden pop.

Wörterbuch

Ein Wörterbuch ordnet Hash-Werte beliebigen Objekten zu. Ein Wörterbuch ist ein veränderliches Objekt. Die Hauptoperationen in einem Wörterbuch bestehen darin, einen Wert mit einem Schlüssel zu speichern und den mit dem Schlüssel gegebenen Wert zu extrahieren.

In einem Wörterbuch können Sie keine Schlüsselwerte verwenden, die nicht hashbar sind, dh Werte, die Listen, Wörterbücher oder andere veränderbare Typen enthalten.

einstellen

Ein Set ist eine ungeordnete Sammlung verschiedener hashbarer Objekte. Ein Satz wird üblicherweise verwendet, um Mitgliedschaftstests, das Entfernen von Duplikaten aus einer Sequenz und das Berechnen mathematischer Operationen wie Schnittmenge, Vereinigung, Differenz und symmetrische Differenz einzuschließen.

lmiguelvargasf
quelle
5

Obwohl dies nicht sets abdeckt , ist es eine gute Erklärung für dicts und lists:

Listen sind das, was sie scheinen - eine Liste von Werten. Jeder von ihnen ist beginnend mit Null nummeriert - der erste ist mit Null nummeriert, die zweite mit 1, die dritte mit 2 usw. Sie können Werte aus der Liste entfernen und am Ende neue Werte hinzufügen. Beispiel: Die Namen Ihrer vielen Katzen.

Wörterbücher ähneln dem, was ihr Name andeutet - einem Wörterbuch. In einem Wörterbuch haben Sie einen 'Index' von Wörtern und für jedes von ihnen eine Definition. In Python wird das Wort als "Schlüssel" und die Definition als "Wert" bezeichnet. Die Werte in einem Wörterbuch sind nicht nummeriert - ähnlich wie der Name vermuten lässt - ein Wörterbuch. In einem Wörterbuch haben Sie einen 'Index' von Wörtern und für jedes von ihnen eine Definition. Die Werte in einem Wörterbuch sind nicht nummeriert - sie sind auch nicht in einer bestimmten Reihenfolge - der Schlüssel macht dasselbe. Sie können die Werte in Wörterbüchern hinzufügen, entfernen und ändern. Beispiel: Telefonbuch.

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

Gans
quelle
4

Für C ++ hatte ich immer dieses Flussdiagramm im Auge: In welchem ​​Szenario verwende ich einen bestimmten STL-Container? Ich war neugierig, ob etwas Ähnliches auch für Python3 verfügbar ist, aber ich hatte kein Glück.

Was Sie für Python beachten müssen, ist: Es gibt keinen einzigen Python-Standard wie für C ++. Daher kann es für verschiedene Python-Interpreter (z. B. CPython, PyPy) große Unterschiede geben. Das folgende Flussdiagramm gilt für CPython.

Außerdem fand ich keine gute Möglichkeit , die folgenden Datenstrukturen in das Diagramm zu übernehmen: bytes, byte arrays, tuples, named_tuples, ChainMap, Counter, und arrays.

  • OrderedDictund dequesind über collectionsModul verfügbar .
  • heapqist im heapqModul erhältlich
  • LifoQueue,, Queueund PriorityQueuesind über das queueModul verfügbar, das für den gleichzeitigen Zugriff (Threads) ausgelegt ist. (Es ist auch eine multiprocessing.Queueverfügbar, aber ich kenne die Unterschiede nicht, queue.Queuewürde aber davon ausgehen, dass sie verwendet werden sollte, wenn ein gleichzeitiger Zugriff von Prozessen erforderlich ist.)
  • dict, set, frozen_set, Und listsind gebautet natürlich

Für jeden wäre ich dankbar, wenn Sie diese Antwort verbessern und in jeder Hinsicht ein besseres Diagramm liefern könnten. Fühlen Sie sich frei und willkommen. Flussdiagramm

PS: Das Diagramm wurde mit yed erstellt. Die Graphml-Datei ist hier

Mathe
quelle
3

In Kombination mit Listen , Dikten und Mengen gibt es noch weitere interessante Python-Objekte, OrderedDicts .

Bestellte Wörterbücher sind wie normale Wörterbücher, erinnern sich jedoch an die Reihenfolge, in der Elemente eingefügt wurden. Beim Durchlaufen eines geordneten Wörterbuchs werden die Elemente in der Reihenfolge zurückgegeben, in der ihre Schlüssel zuerst hinzugefügt wurden.

OrderedDicts kann nützlich sein, wenn Sie die Reihenfolge der Schlüssel beibehalten müssen, z. B. beim Arbeiten mit Dokumenten: Es ist üblich, die Vektordarstellung aller Begriffe in einem Dokument zu benötigen. Mit OrderedDicts können Sie also effizient überprüfen, ob ein Begriff zuvor gelesen wurde, Begriffe hinzufügen, Begriffe extrahieren und nach allen Manipulationen die geordnete Vektordarstellung davon extrahieren.

Federico Caccia
quelle
1

Listen sind das, was sie scheinen - eine Liste von Werten. Jeder von ihnen ist beginnend mit Null nummeriert - der erste ist mit Null nummeriert, die zweite mit 1, die dritte mit 2 usw. Sie können Werte aus der Liste entfernen und am Ende neue Werte hinzufügen. Beispiel: Die Namen Ihrer vielen Katzen.

Tupel sind wie Listen, aber Sie können ihre Werte nicht ändern. Die Werte, die Sie zuerst aufgeben, sind die Werte, an denen Sie für den Rest des Programms festhalten. Auch hier ist jeder Wert zur leichteren Bezugnahme ab Null nummeriert. Beispiel: die Namen der Monate des Jahres.

Wörterbücher ähneln dem, was ihr Name andeutet - einem Wörterbuch. In einem Wörterbuch haben Sie einen 'Index' von Wörtern und für jedes von ihnen eine Definition. In Python wird das Wort als "Schlüssel" und die Definition als "Wert" bezeichnet. Die Werte in einem Wörterbuch sind nicht nummeriert - ähnlich wie der Name vermuten lässt - ein Wörterbuch. In einem Wörterbuch haben Sie einen 'Index' von Wörtern und für jedes von ihnen eine Definition. In Python wird das Wort als "Schlüssel" und die Definition als "Wert" bezeichnet. Die Werte in einem Wörterbuch sind nicht nummeriert - sie sind auch nicht in einer bestimmten Reihenfolge - der Schlüssel macht dasselbe. Sie können die Werte in Wörterbüchern hinzufügen, entfernen und ändern. Beispiel: Telefonbuch.

Nitish Kumar Pal
quelle
1

Wenn ich sie benutze, erstelle ich ein ausführliches Cheatsheet ihrer Methoden als Referenz:

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'}}
Infinitesimalrechnung
quelle
1

Wörterbuch: Ein Python-Wörterbuch wird wie eine Hash-Tabelle mit Schlüssel als Index und Objekt als Wert verwendet.

Liste: Eine Liste wird zum Halten von Objekten in einem Array verwendet, die nach der Position dieses Objekts im Array indiziert sind.

Set: Ein Set ist eine Sammlung mit Funktionen, die erkennen können, ob ein Objekt im Set vorhanden ist oder nicht.

Srinivas P.
quelle