umwandeln - tupel liste python




Was ist der Unterschied zwischen Listen und Tupeln? (10)

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 Ordnung.

Durch diese Unterscheidung wird Code klarer und verständlicher.

Ein Beispiel wären Paare von Seiten- und Zeilennummern zu Referenzorten in einem Buch, zB:

my_location = (42, 11)  # page number, line number

Sie können dies dann als Schlüssel in einem Wörterbuch verwenden, um Notizen zu Speicherorten zu speichern. Eine Liste auf der anderen Seite könnte verwendet werden, um mehrere Orte zu speichern. Natürlich möchte man möglicherweise Orte aus der Liste hinzufügen oder entfernen, daher ist es sinnvoll, dass Listen änderbar sind. Auf der anderen Seite macht es keinen Sinn, Elemente aus einem bestehenden Ort hinzuzufügen oder zu entfernen - daher sind Tupel unveränderlich.

Es kann Situationen geben, in denen Sie Elemente in einem vorhandenen Positionstupel ändern möchten, z. B. beim Durchlaufen der Zeilen einer Seite. Die Unveränderbarkeit von Tupeln zwingt Sie jedoch, für jeden neuen Wert ein neues Tupel zu erstellen. Dies erscheint auf den ersten Blick unbequem, aber die Verwendung von unveränderlichen Daten wie diesen ist ein Eckpfeiler von Werttypen und funktionalen Programmiertechniken, die wesentliche Vorteile haben können.

Es gibt einige interessante Artikel zu diesem Thema, zB "Python-Tupel sind nicht nur konstante Listen" oder "Tupel gegen 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 sein. 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 darstellen.

Was ist der Unterschied?

Was sind die Vor- und Nachteile von Tupeln / Listen?


Der PEP 484 - Type Hints sagt, dass die Arten von Elementen eines tuple individuell typisiert werden können; damit du Tuple[str, int, float] sagen kannst; aber eine list mit List typing class kann nur einen Typparameter nehmen: List[str] , was darauf hinweist, dass der Unterschied der 2 wirklich darin besteht, dass ersteres heterogen ist, während letzteres intrinsisch homogen ist.

Außerdem verwendet die Standardbibliothek das Tupel meistens als einen Rückgabewert von solchen Standardfunktionen, wo das C eine struct .


Die Werte der Liste können jederzeit geändert werden, aber die Werte der Tupel können 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, sonst ist Liste die beste Option.


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 sie beide Sammlungen von Werten sind. Neben dem flachen Unterschied, dass Listen mit Klammern "[..., ...]" und Tupel mit Klammern "(..., ...)" erstellt werden, unterscheiden sich die Kerntechniken "fest in Pythonsyntax codiert" ist, dass die Elemente eines bestimmten Tupels unveränderlich sind, während Listen veränderbar sind (... so sind nur Tupel hashbar und können als Dictionary / Hash-Schlüssel verwendet werden!). Dies führt zu Unterschieden in der Art und Weise, in der sie verwendet werden können oder nicht (die a priori durch Syntax erzwungen werden) und in der Art und Weise, wie sich die Benutzer entscheiden, sie zu verwenden (ermutigt als "best practices", a posteriori, das ist, was intelligente Programmierer tun). Der Hauptunterschied a posteriori bei der Unterscheidung, wann Tupel verwendet werden, gegenüber dem Gebrauch von Listen besteht darin, welche Bedeutung die Menschen der Reihenfolge der Elemente geben.

Für Tupel bedeutet "Ordnung" nicht mehr als nur eine spezifische "Struktur" für das Halten von Informationen. Welche Werte in dem ersten Feld gefunden werden, kann leicht in das zweite Feld umgeschaltet werden, da jedes Werte über zwei verschiedene Dimensionen oder Skalen bereitstellt. Sie geben Antworten auf verschiedene Arten von Fragen und haben typischerweise die Form: Für ein bestimmtes Objekt / Thema, was sind seine Attribute? Das Objekt / Motiv bleibt konstant, die Attribute unterscheiden sich.

Bei Listen bedeutet "Reihenfolge" eine Sequenz oder eine Direktionalität. Das zweite Element muss nach dem ersten Element kommen, da es auf der Grundlage einer bestimmten und gemeinsamen Skala oder Dimension an zweiter Stelle positioniert ist. Die Elemente werden als Ganzes genommen und liefern meist Antworten auf eine einzelne Frage, typischerweise die Form, für ein gegebenes Attribut, wie vergleichen sich diese Objekte / Subjekte? Das Attribut bleibt konstant, das Objekt / Motiv unterscheidet sich.

Es gibt unzählige Beispiele von Menschen in der Populärkultur und Programmierer, die diesen Unterschieden nicht entsprechen und es gibt unzählige Menschen, die eine Salatgabel für ihren Hauptgang 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:

  1. Duplikate - Sowohl Tupel als auch Listen erlauben Duplikate
  2. Indexing, Selecting & Slicing - Sowohl Tupel als auch Listen indexieren mit Integer-Werten in Klammern. Wenn Sie also die ersten drei Werte einer gegebenen Liste oder eines Tupels haben möchten, wäre die Syntax dieselbe:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
    
  3. Vergleichen und Sortieren - Zwei Tupel oder zwei Listen werden beide durch ihr erstes Element verglichen, und wenn es eine Bindung gibt, dann durch das zweite Element und so weiter. Späteren Elementen wird keine weitere Aufmerksamkeit geschenkt, wenn frühere Elemente einen Unterschied zeigen.

    >>> [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 definitionem

  1. Syntax - Listen verwenden [], Tupel verwenden ()

  2. Mutabilität - Elemente in einer gegebenen Liste sind veränderbar, Elemente in einem gegebenen Tupel sind NICHT änderbar.

    # 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
    
  3. 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, in Verwendung

  1. Homo vs. Heterogenität von Elementen - Im Allgemeinen sind Listenobjekte homogen und Tupelobjekte sind heterogen. Das heißt, Listen werden für Objekte / Themen des gleichen Typs (wie alle Präsidentschaftskandidaten oder alle Lieder oder alle Läufer) verwendet, obwohl Tupel eher für heterogene Objekte gedacht sind.

  2. Looping vs. Structures - Obwohl beide Schleifen ermöglichen (für x in my_list ...), ist es nur sinnvoll, dies für eine Liste zu tun. Tupel eignen sich besser zum Strukturieren und Präsentieren von Informationen (% s% s, die in% s liegen, sind% s und momentan% s% ("John", "Wayne", 90210, "Schauspieler", "Dead"))


Es wurde erwähnt, dass der Unterschied weitgehend semantisch ist: Die Leute erwarten, dass ein Tupel und eine Liste verschiedene Informationen repräsentieren. Aber das geht weiter als eine Richtlinie; Einige Bibliotheken verhalten sich tatsächlich anders, je nachdem, was sie passieren. Nimm zum Beispiel NumPy (kopiert von einem anderen Post, wo 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, während NumPy möglicherweise nicht Teil der Standard-Bibliothek ist, ist es eine große Python-Bibliothek, und in NumPy Listen und Tupel sind völlig verschiedene Dinge.


List ist änderbar und Tupel ist unveränderlich. Der Hauptunterschied zwischen veränderbar und unveränderbar ist die Speichernutzung, wenn Sie versuchen, ein Objekt anzufügen.

Wenn Sie eine Variable erstellen, wird der Variablen ein bestimmter fester Speicher zugewiesen. Wenn es sich um eine Liste handelt, wird mehr Speicher zugewiesen als tatsächlich verwendet. Wenn z. B. die aktuelle Speicherzuweisung 100 Byte beträgt, werden beim Anfügen des 101. Byte möglicherweise weitere 100 Byte zugewiesen (in diesem Fall insgesamt 200 Byte).

Wenn Sie jedoch wissen, dass Sie häufig keine neuen Elemente hinzufügen, sollten Sie Tupel verwenden. Tuples weist genau die Größe des benötigten Speichers zu und spart somit Speicher, besonders wenn Sie große Speicherblöcke verwenden.


Listen sind für Schleifen, Tupel sind für Strukturen, zB "%s %s" %tuple .

Listen sind in der Regel homogen, Tupel sind meist heterogen.

Listen sind für variable Länge, Tupel sind für feste Länge.


Listen sind veränderbar; Tupel sind nicht.

Aus docs.python.org/2/tutorial/datastructures.html

Tupel sind unveränderlich und enthalten in der Regel eine heterogene Abfolge von Elementen, auf die durch Entpacken (siehe weiter unten in diesem Abschnitt) oder Indizierung (oder sogar im Fall von namedtuples durch Attribut) zugegriffen wird. Listen sind änderbar und ihre Elemente sind normalerweise homogen und werden durch Iterieren über die Liste aufgerufen.


Unterschied zwischen Liste und Tupel

  1. Buchstäblich

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. Größe

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    Aufgrund der geringeren Größe eines Tupel-Vorgangs wird es ein bisschen schneller, aber nicht viel zu erwähnen, bis Sie eine riesige Anzahl von Elementen haben.

  3. Erlaubte Operationen

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error
    

    Das bedeutet auch, dass Sie ein Element nicht löschen oder ein Tupel nicht 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 die ID des Tupels ändern, indem Sie ein Element hinzufügen

    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
    
  4. Verwendung

    Da eine Liste änderbar ist, kann sie nicht als Schlüssel in einem Wörterbuch verwendet werden, während ein Tupel verwendet werden kann.

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    

Wenn Sie spazieren gehen, können 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 du konntest es nicht umgekehrt tun.





tuples