Wann sollte ich ein Wörterbuch, eine Liste oder ein Set verwenden?
Gibt es Szenarien, die für jeden Datentyp besser geeignet sind?
Eine list
behält die Reihenfolge, dict
und set
nicht: Wenn Sie sich um die Bestellung kümmern, müssen Sie list
verwenden (falls Ihre Auswahl an Containern auf diese drei beschränkt ist, natürlich ;-)).
dict
ordnet jedem Schlüssel einen Wert zu, während list
und set
Werte enthalten: ganz unterschiedliche Anwendungsfälle.
set
erfordert, dass Elemente hashierbar sind, list
nicht: Wenn Sie nicht-hashable -Elemente haben, können Sie set
nicht verwenden und müssen stattdessen list
verwenden.
set
verbietet Duplikate, list
: keine entscheidende Unterscheidung. (Ein "Multiset", das Duplikate für mehr als einmal vorhandene Elemente in eine andere Anzahl einordnet, finden Sie in collections.Counter
- Sie könnten eines als dict
erstellen, wenn Sie aus irgendeinem seltsamen Grund collections
oder nicht importieren konnten vor-2.7 Python als collections.defaultdict(int)
, wobei die Elemente als Schlüssel und der zugehörige Wert als Zähler verwendet werden).
Die Überprüfung der Mitgliedschaft eines Werts in einer Variablen set
(oder dict
für Schlüssel) ist unglaublich schnell (etwa eine konstante, kurze Zeit), während in einer Liste Zeit benötigt wird, die der Länge der Liste im Durchschnitt und im ungünstigsten Fall proportional ist. Wenn Sie also hashable Elemente haben, sich nicht um die Reihenfolge oder Duplikate kümmern und eine schnelle Überprüfung der Mitgliedschaft wünschen, ist set
besser als list
.
Verwenden Sie ein Wörterbuch, wenn Sie über eindeutige Schlüssel verfügen, die Werten zugeordnet werden.
Verwenden Sie eine Liste, wenn Sie eine bestellte Sammlung von Artikeln haben.
Verwenden Sie einen Satz, um einen ungeordneten Satz von Elementen zu speichern.
Wenn Sie eine ungeordnete Sammlung eindeutiger Elemente wünschen, verwenden Sie eine set
. (Zum Beispiel, wenn Sie die Menge aller in einem Dokument verwendeten Wörter wünschen).
Wenn Sie eine unveränderliche geordnete Liste von Elementen erfassen möchten, verwenden Sie eine Tuple
. (Wenn Sie z. B. ein Paar (Name, Telefonnummer_Nummer) als Element in einem Set verwenden möchten, benötigen Sie ein Tuple-Element und keine Liste, da für Sets ein Element unveränderlich sein muss.).
Wenn Sie eine veränderliche geordnete Liste von Elementen sammeln möchten, verwenden Sie eine list
. (Wenn Sie beispielsweise neue Telefonnummern an eine Liste anhängen möchten: [Nummer1, Nummer2, ...]).
Wenn Sie eine Zuordnung von Schlüsseln zu Werten erstellen möchten, verwenden Sie eine dict
. (Zum Beispiel, wenn Sie ein Telefonbuch möchten, in dem Namen Telefonnummern zugeordnet werden: {'John Smith' : '555-1212'}
). Beachten Sie, dass die Schlüssel in einem Diktum nicht geordnet sind. (Wenn Sie durch ein Diktierbuch (Telefonbuch) iterieren, werden die Tasten (Namen) möglicherweise in beliebiger Reihenfolge angezeigt.
Obwohl dies nicht set
s abdeckt, ist es eine gute Erklärung für dict
s und list
s:
Listen sind wie es scheint - eine Liste von Werten. Jeder von ihnen ist nummeriert, beginnend mit null - der erste ist mit null nummeriert, der zweite 1, dritte 3 usw. Sie können Werte aus der Liste entfernen und füge neue Werte am Ende hinzu. Beispiel: Ihre vielen Katzennamen.
Wörterbücher ähneln dem, was ihr Name vermuten lässt - ein Wörterbuch . In einem Wörterbuch haben Sie einen 'Index' von Wörtern und für jeden von ihnen ein Definition. In Python heißt das Wort 'Schlüssel' und die Definition ein Wert'. Die Werte in einem Wörterbuch sind nicht nummeriert. was ihr Name vermuten lässt - ein Wörterbuch. In einem Wörterbuch haben Sie ein 'Index' von Wörtern und für jeden eine Definition. Die Werte in ein Wörterbuch ist nicht nummeriert - es gibt keine bestimmte Reihenfolge, entweder - der Schlüssel macht das Gleiche. Sie können .__ hinzufügen, entfernen und ändern. die Werte in Wörterbüchern. Beispiel: Telefonbuch.
Wenn ich sie benutze, mache ich ein umfassendes Cheatsheet mit ihren 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'}}
Kurz gesagt, verwenden Sie:
list
- wenn Sie eine bestellte Abfolge von Artikeln benötigen.
dict
- wenn Sie Werte mit Schlüsseln verknüpfen müssen
set
- wenn Sie eindeutige Elemente beibehalten möchten.
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 x
in l
(um oder nach i
und vor j
Indecies)Eine Liste implementiert auch alle veränderlichen Sequenzoperationen:
l[i] = x
- Item i
von l
wird ersetzt durch x
l[i:j] = t
- Scheibe von l
von i
bis j
wird durch den Inhalt des iterablen t
ersetztdel l[i:j]
- wie l[i:j] = []
l[i:j:k] = t
- Die Elemente von l[i:j:k]
werden durch die von t
ersetzt.del l[i:j:k]
- Entfernt die Elemente von s[i:j:k]
aus der Listel.append(x)
- fügt x
an das Ende der Sequenz anl.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
- erweitert l
um den Inhalt von t
l *= n
- aktualisiert l
, wobei der Inhalt n
Mal wiederholt wirdl.insert(i, x)
- fügt x
in l
an dem von i
angegebenen Index einl.pop([i])
- ruft das Objekt unter i
ab und entfernt es auch aus l
l.remove(x)
- entferne den ersten Gegenstand aus l
, wobei l[i]
gleich x istl.reverse()
- kehrt die Elemente von l
umEine Liste kann als Stapel verwendet werden, indem die Methoden append
und pop
verwendet werden.
Ein Wörterbuch ordnet Hashwerte beliebigen Objekten zu. Ein Wörterbuch ist ein veränderliches Objekt. Die Hauptoperationen in einem Wörterbuch sind das Speichern eines Werts mit einem Schlüssel und das Extrahieren des Werts mit dem Schlüssel.
In einem Wörterbuch können Sie keine Werte als Schlüssel verwenden, die nicht hashbar sind, dh Werte, die Listen, Wörterbücher oder andere veränderbare Typen enthalten.
Ein Set ist eine ungeordnete Sammlung unterschiedlicher Hash-Objekte. Ein Satz wird üblicherweise zum Testen der Zugehörigkeit, zum Entfernen von Duplikaten aus einer Sequenz und zum Berechnen mathematischer Operationen wie Schnittmenge, Vereinigung, Differenz und symmetrische Differenz verwendet.
In Kombination mit liste, dicts und sets gibt es noch weitere interessante Python-Objekte, OrderedDicts .
Geordnete 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öchten, beispielsweise beim Arbeiten mit Dokumenten: Üblicherweise benötigen Sie die Vektordarstellung aller Begriffe in einem Dokument. Mit OrderedDicts können Sie effizient überprüfen, ob ein Begriff zuvor gelesen wurde, Begriffe hinzufügen, Begriffe extrahieren und nach all den Manipulationen die geordnete Vektordarstellung daraus extrahieren.
Listen sind, wie sie scheinen - eine Liste von Werten. Jeder von ihnen ist von Null ausgehend nummeriert - der erste ist mit Null nummeriert, der zweite 1, der dritte 2 usw. Sie können Werte aus der Liste entfernen und am Ende neue Werte hinzufügen. Beispiel: Ihre vielen Katzennamen.
Tupel sind wie Listen, aber ihre Werte können nicht geändert werden. Die Werte, die Sie zuerst angeben, sind die Werte, die Sie für den Rest des Programms beibehalten. Jeder Wert ist wieder von Null aus nummeriert. Beispiel: die Namen der Monate des Jahres.
Wörterbücher ähneln dem, was ihr Name vermuten lässt - ein Wörterbuch. In einem Wörterbuch haben Sie einen "Index" von Wörtern und für jedes eine Definition. In Python wird das Wort 'Schlüssel' und die Definition 'Wert' genannt. Die Werte in einem Wörterbuch sind nicht nummeriert - ähnlich dem, was ihr Name vermuten lässt - einem Wörterbuch. In einem Wörterbuch haben Sie einen "Index" von Wörtern und für jedes eine Definition. In Python wird das Wort 'Schlüssel' und die Definition 'Wert' genannt. Die Werte in einem Wörterbuch sind nicht nummeriert - sie haben auch keine bestimmte Reihenfolge - der Schlüssel bewirkt dasselbe. Sie können die Werte in Wörterbüchern hinzufügen, entfernen und ändern. Beispiel: Telefonbuch.
Für C++ hatte ich immer dieses Flussdiagramm im Auge: In welchem Szenario verwende ich einen bestimmten STL-Container? , also war ich neugierig, ob es auch etwas ähnliches für Python3 gibt, aber ich hatte kein Glück.
Was Sie für Python beachten müssen, ist Folgendes: 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 ist für CPython.
Außerdem habe ich keine gute Möglichkeit gefunden, die folgenden Datenstrukturen in das Diagramm aufzunehmen: bytes
, byte arrays
, tuples
, named_tuples
, ChainMap
, Counter
und arrays
.
OrderedDict
und deque
sind über das Modul collections
verfügbar.heapq
ist im Modul heapq
verfügbarLifoQueue
, Queue
und PriorityQueue
sind über das Modul queue
verfügbar, das für den gleichzeitigen Zugriff (Threads) ausgelegt ist. (Es gibt auch einen multiprocessing.Queue
, aber ich kenne die Unterschiede zu queue.Queue
nicht, würde aber davon ausgehen, dass er verwendet werden sollte, wenn gleichzeitiger Zugriff von Prozessen benötigt wird.)dict
, set
, frozen_set
und list
sind natürlich eingebautFü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 .
PS: Das Diagramm wurde mit Yed erstellt. Die Graphml-Datei ist hier