Was ist der Unterschied?
Was sind die Vor- und Nachteile von Tupeln / Listen?
list
. ; D
Was ist der Unterschied?
Was sind die Vor- und Nachteile von Tupeln / Listen?
list
. ; D
Antworten:
Abgesehen davon, dass Tupel unveränderlich sind, gibt es auch eine semantische Unterscheidung, die ihre Verwendung leiten sollte. Tupel sind heterogene Datenstrukturen (dh ihre Einträge haben unterschiedliche Bedeutungen), während Listen homogene Sequenzen sind. Tupel haben Struktur, Listen haben Reihenfolge.
Die Verwendung dieser Unterscheidung macht Code expliziter und verständlicher.
Ein Beispiel wären Seiten- und Zeilennummernpaare zu Referenzpositionen in einem Buch, z.
my_location = (42, 11) # page number, line number
Sie können dies dann als Schlüssel in einem Wörterbuch verwenden, um Notizen zu Orten zu speichern. Eine Liste hingegen könnte zum Speichern mehrerer Speicherorte verwendet werden. Natürlich möchte man vielleicht Orte zur Liste hinzufügen oder daraus entfernen, daher ist es sinnvoll, dass Listen veränderbar sind. Andererseits ist es nicht sinnvoll, Elemente zu einem vorhandenen Speicherort hinzuzufügen oder daraus zu entfernen - daher sind Tupel unveränderlich.
Es kann Situationen geben, in denen Sie Elemente innerhalb eines vorhandenen Standorttupels ändern möchten, z. B. wenn Sie durch die Zeilen einer Seite iterieren. Die Unveränderlichkeit von Tupeln zwingt Sie jedoch dazu, für jeden neuen Wert ein neues Standorttupel zu erstellen. Dies scheint auf den ersten Blick unpraktisch zu sein, aber die Verwendung unveränderlicher Daten wie dieser ist ein Eckpfeiler von Werttypen und funktionalen Programmiertechniken, die erhebliche Vorteile haben können.
Es gibt einige interessante Artikel zu diesem Thema, z. B. "Python-Tupel sind nicht nur konstante Listen" oder "Tupel vs. Listen in Python verstehen" . Die offizielle Python-Dokumentation erwähnt dies ebenfalls
"Tupel sind unveränderlich und enthalten normalerweise eine heterogene Sequenz ...".
In einer statisch typisierten Sprache wie Haskell haben die Werte in einem Tupel im Allgemeinen unterschiedliche Typen und die Länge des Tupels muss festgelegt werden. In einer Liste haben alle Werte den gleichen Typ und die Länge ist nicht festgelegt. Der Unterschied ist also sehr offensichtlich.
Schließlich gibt es das Namedtuple in Python, was sinnvoll ist, da ein Tupel bereits eine Struktur haben soll. Dies unterstreicht die Idee, dass Tupel eine leichte Alternative zu Klassen und Instanzen sind.
collections.namedtuple
besser angerufen collections.record
. Es wäre nicht sinnvoll, beispielsweise den Namen und die Adresse in einem Kundendatensatz auszutauschen. In der Tat wäre dies im Allgemeinen ein Fehler, den Sie aufgrund der Unveränderlichkeit des Tupels nicht begehen können.
What would you do with such a list?
ich immer, wenn Leute mangelnde Fantasie als Argument verwenden. Die Verwendung von Listen mit gemischten Typen eignet sich hervorragend, z. B. für einige hierarchische Datenstrukturen, bei denen jede Liste aus untergeordneten Listen und Wertelementen besteht.
Unterschied zwischen Liste und Tupel
Wörtlich
someTuple = (1,2)
someList = [1,2]
Größe
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
Aufgrund der geringeren Größe einer Tupeloperation wird sie etwas schneller, aber nicht so viel zu erwähnen, bis Sie eine große Anzahl von Elementen haben.
Zulässige Operationen
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
Das bedeutet auch, dass Sie kein Element löschen oder ein Tupel sortieren können. Sie können jedoch sowohl der Liste als auch dem Tupel ein neues Element hinzufügen, mit dem einzigen Unterschied, dass Sie, da das Tupel unveränderlich ist, nicht wirklich ein Element hinzufügen, sondern ein neues Tupel erstellen, sodass sich die ID von ändert
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
Verwendungszweck
Da eine Liste veränderbar ist, kann sie nicht als Schlüssel in einem Wörterbuch verwendet werden, wohingegen ein Tupel verwendet werden kann.
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
3. Permitted operation
zeigt zuerst den Tupelfall. Ich weiß, dass es üblich ist, Erfolg und dann Fehler zu zeigen, aber das hat meinen Kopf für einige Momente durcheinander gebracht.
one_item_list = [a]
, ist aber one_tuple = (a,)
das entsprechende Tupel. Beachten Sie das Komma nach dem Variablennamen. Aber auch beachten two_tuple = (a, b)
. Das hat mich mehr als einmal umgehauen (immer noch in Python 3).
tuple(sorted(the_unsorted_tuple))
Wenn Sie spazieren gingen, konnten Sie Ihre Koordinaten jederzeit in einem (x,y)
Tupel notieren .
Wenn Sie Ihre Reise aufzeichnen möchten, können Sie Ihren Standort alle paar Sekunden an eine Liste anhängen.
Aber anders herum konnte man es nicht machen.
Der Hauptunterschied besteht darin, dass Tupel unveränderlich sind. Dies bedeutet, dass Sie die Werte in einem Tupel nach dem Erstellen nicht mehr ändern können.
Wenn Sie also die Werte ändern müssen, verwenden Sie eine Liste.
Vorteile für Tupel:
frozenset
oder für die verschiedenen eingefrorenen Diktate / Bäume / etc. Von Drittanbietern. Typen, aber keiner von diesen erlaubt es Ihnen, veränderbare Elemente hinzuzufügen. (Und natürlich ist ein Tupel nur hashbar, wenn alle seine Elemente, die auf die übliche EAFP-Weise behandelt werden, d[1, [2]]
erhöht werden TypeError: unhashable type: 'list'
.)
Listen sind veränderlich; Tupel sind nicht.
Von docs.python.org/2/tutorial/datastructures.html
Tupel sind unveränderlich und enthalten normalerweise eine heterogene Folge von Elementen, auf die durch Entpacken (siehe weiter unten in diesem Abschnitt) oder Indizieren (oder sogar durch Attribute bei benannten Tupeln) zugegriffen wird. Listen sind veränderlich und ihre Elemente sind normalerweise homogen und werden durch Iterieren über die Liste aufgerufen.
Es wurde erwähnt, dass der Unterschied weitgehend semantisch ist: Die Leute erwarten, dass ein Tupel und eine Liste unterschiedliche Informationen darstellen. Dies geht jedoch über eine Richtlinie hinaus. Einige Bibliotheken verhalten sich je nach Übergabe unterschiedlich. Nehmen Sie zum Beispiel NumPy (kopiert von einem anderen Beitrag, in dem ich nach weiteren Beispielen frage):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
Der Punkt ist, dass NumPy zwar nicht Teil der Standardbibliothek ist, es sich jedoch um eine wichtige Python-Bibliothek handelt und dass NumPy-Listen und -Tupel völlig unterschiedliche Dinge sind.
type(a_list) != type(a_tuple)
, dass sich jeder Zweig des Bibliothekscodes, auf dem er verzweigt, type(x)
anders verhält
'%d %d' % [2, 3]
a TypeError
, weil Sie versuchen, eine Liste an die erste zu übergeben, %d
und Sie keinen Wert an die zweite übergeben %d
. (Es gibt jedoch auch Gegenbeispiele dazu, wie max
…)
Listen sind für Schleifen, Tupel für Strukturen, dh "%s %s" %tuple
.
Listen sind normalerweise homogen, Tupel sind normalerweise heterogen.
Listen sind für variable Länge, Tupel für feste Länge.
Dies ist ein Beispiel für Python-Listen:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
Dies ist ein Beispiel für ein Python-Tupel:
my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Python-Listen und -Tupel sind insofern ähnlich, als beide geordnete Wertesammlungen sind. Neben dem geringen Unterschied, dass Listen mit Klammern "[..., ...]" und Tupeln mit Klammern "(..., ...)" erstellt werden, besteht zwischen ihnen der technische Kernunterschied "fest in Python-Syntax fest codiert" ist, dass die Elemente eines bestimmten Tupels unveränderlich sind, während Listen veränderlich sind (... also sind nur Tupel hashbar und können als Wörterbuch- / Hash-Schlüssel verwendet werden!). Dies führt zu Unterschieden in der Art und Weise, wie sie verwendet werden können oder nicht (a priori durch Syntax erzwungen), und zu Unterschieden in der Art und Weise, wie Menschen sie verwenden (empfohlen als "Best Practices", a posteriori, dies ist, was intelligente Programmierer tun). Menschen geben in der Reihenfolge der Elemente.
Für Tupel bedeutet "Reihenfolge" nichts anderes als nur eine bestimmte "Struktur" zum Speichern von Informationen. Welche Werte im ersten Feld gefunden werden, kann leicht in das zweite Feld umgeschaltet werden, da jedes Werte über zwei verschiedene Dimensionen oder Skalen liefert. Sie geben Antworten auf verschiedene Arten von Fragen und haben typischerweise die Form: Welche Attribute hat ein bestimmtes Objekt / Subjekt? Das Objekt / Subjekt bleibt konstant, die Attribute unterscheiden sich.
Bei Listen bedeutet "Reihenfolge" eine Sequenz oder eine Richtung. Das zweite Element MUSS nach dem ersten Element stehen, da es auf der Grundlage einer bestimmten und gemeinsamen Skala oder Dimension an zweiter Stelle positioniert ist. Die Elemente werden als Ganzes betrachtet und geben meistens Antworten auf eine einzelne Frage, die typischerweise der Form entspricht. Wie vergleichen sich diese Objekte / Subjekte für ein bestimmtes Attribut? Das Attribut bleibt konstant, das Objekt / Subjekt unterscheidet sich.
Es gibt unzählige Beispiele von Menschen in der Populärkultur und Programmierer, die sich diesen Unterschieden nicht anpassen, und es gibt unzählige Menschen, die eine Salatgabel als Hauptgericht verwenden könnten. Am Ende des Tages ist es in Ordnung und beide können normalerweise die Arbeit erledigen.
Um einige der feineren Details zusammenzufassen
Ähnlichkeiten:
Indizieren, Auswählen und Aufteilen - Sowohl Tupel als auch Listen werden mit ganzzahligen Werten in Klammern indiziert. Wenn Sie also die ersten 3 Werte einer bestimmten Liste oder eines bestimmten Tupels möchten, ist die Syntax dieselbe:
>>> my_list[0:3]
[0,1,2]
>>> my_tuple[0:3]
[a,b,c]
Vergleichen und Sortieren - Zwei Tupel oder zwei Listen werden beide nach ihrem ersten Element verglichen, und wenn es einen Gleichstand gibt, nach dem zweiten Element und so weiter. Nachfolgende Elemente werden nicht weiter beachtet, nachdem frühere Elemente einen Unterschied aufweisen.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
True
>>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
True
Unterschiede: - A priori per Definition
Syntax - Listen verwenden [], Tupel verwenden ()
Wandelbarkeit - Elemente in einer vorgegebenen Liste sind wandelbar, Elemente in einem bestimmten Tupel nicht wandelbar sind.
# Lists are mutable:
>>> top_rock_list
['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
>>> top_rock_list[1]
'Kashmir'
>>> top_rock_list[1] = "Stairway to Heaven"
>>> top_rock_list
['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
# Tuples are NOT mutable:
>>> celebrity_tuple
('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
>>> celebrity_tuple[5]
'Dead'
>>> celebrity_tuple[5]="Alive"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Hashtabellen (Wörterbücher ) - Da Hashtabellen (Wörterbücher) erfordern, dass ihre Schlüssel hashbar und daher unveränderlich sind, können nur Tupel als Wörterbuchschlüssel und nicht als Listen fungieren.
#Lists CAN'T act as keys for hashtables(dictionaries)
>>> my_dict = {[a,b,c]:"some value"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#Tuples CAN act as keys for hashtables(dictionaries)
>>> my_dict = {("John","Wayne"): 90210}
>>> my_dict
{('John', 'Wayne'): 90210}
Unterschiede - A posteriori, im Gebrauch
Homo vs. Heterogenität von Elementen - Im Allgemeinen sind Listenobjekte homogen und Tupelobjekte heterogen. Das heißt, Listen werden für Objekte / Subjekte des gleichen Typs verwendet (wie alle Präsidentschaftskandidaten oder alle Songs oder alle Läufer), obwohl dies nicht erzwungen wird, während Tupel eher für heterogene Objekte gelten.
Schleifen vs. Strukturen - Obwohl beide Schleifen zulassen (für x in my_list ...), ist es nur wirklich sinnvoll, dies für eine Liste zu tun. Tupel eignen sich besser zum Strukturieren und Präsentieren von Informationen (% s% s in% s sind% s und derzeit% s% ("John", "Wayne", 90210, "Actor", "Dead")).
Die Werte der Liste können jederzeit geändert werden, die Werte der Tupel können jedoch nicht geändert werden.
Die Vor- und Nachteile hängen von der Verwendung ab. Wenn Sie solche Daten haben, die Sie nie ändern möchten, sollten Sie Tupel verwenden müssen, andernfalls ist Liste die beste Option.
Tupel und Listen sind in Python scheinbar ähnliche Sequenztypen.
Wörtliche Syntax
Wir verwenden Klammern ( ), um Tupel und eckige Klammern
[ ]
zu erstellen und eine neue Liste zu erhalten. Wir können auch einen Aufruf des entsprechenden Typs verwenden, um die erforderliche Struktur zu erhalten - Tupel oder Liste.
someTuple = (4,6)
someList = [2,6]
Wandlungsfähigkeit
Tupel sind unveränderlich, während Listen veränderlich sind. Dieser Punkt ist die Basis für die folgenden.
Speichernutzung
Aufgrund der Veränderlichkeit benötigen Sie mehr Speicher für Listen und weniger Speicher für Tupel.
Erweitern
Sie können sowohl Tupeln als auch Listen ein neues Element hinzufügen, mit dem einzigen Unterschied, dass die ID des Tupels geändert wird (dh wir haben ein neues Objekt).
Hashing
Tupel sind hashbar und Listen nicht. Dies bedeutet, dass Sie ein Tupel als Schlüssel in einem Wörterbuch verwenden können. Die Liste kann nicht als Schlüssel in einem Wörterbuch verwendet werden, während ein Tupel verwendet werden kann
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
Semantik
In diesem Punkt geht es mehr um bewährte Verfahren. Sie sollten Tupel als heterogene Datenstrukturen verwenden, während Listen homogene Sequenzen sind.
Listen sollen homogene Sequenzen sein, während Tupel heterogene Datenstrukturen sind.
Wie die Leute hier bereits geantwortet haben, tuples
die unveränderlich lists
sind, während sie veränderlich sind, gibt es einen wichtigen Aspekt bei der Verwendung von Tupeln, an den wir uns erinnern müssen
Wenn das tuple
ein list
oder ein dictionary
darin enthält, können diese geändert werden, auch wenn das tuple
selbst unveränderlich ist.
Nehmen wir zum Beispiel an, wir haben ein Tupel, das eine Liste und ein Wörterbuch als enthält
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
Wir können den Inhalt der Liste als ändern
my_tuple[3][0] = 400
my_tuple[3][1] = 500
was neues Tupel aussehen lässt
(10, 20, 30, [400, 500], {'a': 10})
Wir können auch das Wörterbuch in Tupel als ändern
my_tuple[4]['a'] = 500
Dadurch sieht das gesamte Tupel so aus
(10, 20, 30, [400, 500], {'a': 500})
Dies geschieht, weil list
und dictionary
sind die Objekte und diese Objekte ändern sich nicht, sondern der Inhalt, auf den es zeigt.
Das tuple
bleibt also ausnahmslos unveränderlich
Der PEP 484 - Type Hints besagt, dass die Elementtypen von a tuple
einzeln eingegeben werden können. damit du sagen kannst Tuple[str, int, float]
; Eine Klasse list
mit List
Typisierung kann jedoch nur einen Typparameter annehmen: List[str]
Dies deutet darauf hin, dass der Unterschied der 2 tatsächlich darin besteht, dass die erstere heterogen ist, während die letztere an sich homogen ist.
Außerdem verwendet die Standardbibliothek das Tupel meistens als Rückgabewert von solchen Standardfunktionen, bei denen das C a zurückgeben würde struct
.
Da die Leute bereits die Unterschiede erwähnt haben, werde ich darüber schreiben, warum Tupel.
Warum werden Tupel bevorzugt?
Zuordnungsoptimierung für kleine Tupel
Um die Speicherfragmentierung zu verringern und die Zuweisung zu beschleunigen, verwendet Python alte Tupel erneut. Wenn ein Tupel nicht mehr benötigt wird und weniger als 20 Elemente enthält, anstatt es dauerhaft zu löschen, verschiebt Python es in eine freie Liste.
Eine freie Liste ist in 20 Gruppen unterteilt, wobei jede Gruppe eine Liste von Tupeln mit einer Länge n zwischen 0 und 20 darstellt. Jede Gruppe kann bis zu 2 000 Tupel speichern. Die erste (Null-) Gruppe enthält nur 1 Element und repräsentiert ein leeres Tupel.
>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104
Im obigen Beispiel sehen wir, dass a und b dieselbe ID haben. Das liegt daran, dass wir sofort ein zerstörtes Tupel besetzt haben, das auf der freien Liste stand.
Zuordnungsoptimierung für Listen
Da Listen geändert werden können, verwendet Python nicht die gleiche Optimierung wie in Tupeln. Python-Listen haben jedoch auch eine kostenlose Liste, die jedoch nur für leere Objekte verwendet wird. Wenn eine leere Liste von GC gelöscht oder gesammelt wird, kann sie später wiederverwendet werden.
>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792
Quelle: https://rushter.com/blog/python-lists-and-tuples/
Warum sind Tupel effizienter als Listen? -> https://stackoverflow.com/a/22140115
Ein Richtungszitat aus der Dokumentation zu 5.3. Tupel und Sequenzen :
Obwohl Tupel Listen ähnlich erscheinen mögen, werden sie häufig in unterschiedlichen Situationen und für unterschiedliche Zwecke verwendet. Tupel sind unveränderlich und enthalten normalerweise eine heterogene Folge von Elementen, auf die durch Entpacken (siehe weiter unten in diesem Abschnitt) oder Indizieren (oder sogar durch Attribute bei benannten Tupeln) zugegriffen wird. Listen sind veränderlich und ihre Elemente sind normalerweise homogen und werden durch Iterieren über die Liste aufgerufen .
Erstens sind beide nicht skalare Objekte (auch als zusammengesetzte Objekte bezeichnet) in Python.
+
(brandneues Tupel wird natürlich erstellt)(3,) # -> (3)
statt(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
gibt Ihnen
[1,4,9,16,25,36]
(nicht lesbar)Die Verwendung von list kann auch einen Aliasing-Fehler verursachen (zwei unterschiedliche Pfade, die auf dasselbe Objekt verweisen).
Listen sind veränderlich und Tupel sind unveränderlich. Betrachten Sie einfach dieses Beispiel.
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
Ändern Sie nun die Indexwerte von Liste und Tupel.
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
Daher wurde bewiesen, dass der folgende Code mit Tupel ungültig ist, da wir versucht haben, ein Tupel zu aktualisieren, was nicht zulässig ist.
Liste ist veränderlich und Tupel sind unveränderlich. Der Hauptunterschied zwischen veränderlich und unveränderlich ist die Speichernutzung, wenn Sie versuchen, ein Element anzuhängen.
Wenn Sie eine Variable erstellen, wird der Variablen ein fester Speicher zugewiesen. Wenn es sich um eine Liste handelt, wird mehr Speicher zugewiesen als tatsächlich verwendet. Wenn beispielsweise die aktuelle Speicherzuweisung 100 Byte beträgt und Sie das 101. Byte anhängen möchten, werden möglicherweise weitere 100 Byte zugewiesen (in diesem Fall insgesamt 200 Byte).
Wenn Sie jedoch wissen, dass Sie nicht häufig neue Elemente hinzufügen, sollten Sie Tupel verwenden. Tuples weist genau die Größe des benötigten Speichers zu und spart somit Speicher, insbesondere wenn Sie große Speicherblöcke verwenden.