webentwicklung-frage-antwort-db.com.de

Liste vs Tupel, wann jeweils verwenden?

Wann sollten Sie in Python Listen und wann Tupel verwenden?

Manchmal haben Sie keine Wahl, wenn Sie zum Beispiel haben

"hello %s you are %s years old" % x

dann muss x ein Tupel sein.

Aber wenn ich derjenige bin, der die API entwirft und die Datentypen auswählen kann, wie lauten dann die Richtlinien?

408
flybywire

Es gibt eine starke Tupelkultur für heterogene Auflistungen, ähnlich wie bei Verwendung von structs in C, und Listen für homogene Auflistungen, ähnlich wie bei Verwendung von Arrays. Aber ich habe dies nie ganz mit dem in den anderen Antworten erwähnten Problem der Wandlungsfähigkeit verglichen. Die Wandlungsfähigkeit hat Zähne (Sie können ein Tupel tatsächlich nicht ändern), während die Homogenität nicht erzwungen wird, und scheint daher eine viel weniger interessante Unterscheidung zu sein.

220
Ned Batchelder

Tupel haben eine feste Größe, während Listen dynamisch sind.
Mit anderen Worten, ein Tuple ist unveränderlich , während ein list veränderlich ist .

  1. Sie können einem Tupel keine Elemente hinzufügen. Tupel haben keine Methode zum Anhängen oder Erweitern.
  2. Sie können keine Elemente von einem Tupel entfernen. Tupel haben keine Entfernungs- oder Pop-Methode.
  3. Sie können Elemente in einem Tupel finden, da dies das Tupel nicht ändert.
  4. Sie können auch den Operator in verwenden, um zu überprüfen, ob ein Element im Tupel vorhanden ist.

  • Tupel sind schneller als Listen. Wenn Sie eine konstante Menge von Werten definieren und jemals damit anfangen möchten, iterieren Sie sie mit einem Tupel statt mit einem Liste.

  • Es macht Ihren Code sicherer, wenn Sie Daten „schreibgeschützt“ haben, die nicht geändert werden müssen. Die Verwendung eines Tupels anstelle einer Liste entspricht einer impliziten Aussage, dass diese Daten konstant sind und dass ein besonderer Gedanke (und eine bestimmte Funktion) erforderlich ist, um dies zu überschreiben.

  • Einige Tupel können als Wörterbuchschlüssel verwendet werden (insbesondere Tupel, die unveränderliche Werte wie Zeichenfolgen, Zahlen und andere Tupel enthalten). Listen können niemals als Wörterbuchschlüssel verwendet werden, da Listen nicht unveränderlich sind.

Quelle: Tauchen Sie ein in Python

638
jldupont

Ich glaube (und ich bin mit Python kaum vertraut), dass der Hauptunterschied darin besteht, dass ein Tupel nveränderlich (kann nach der Zuweisung nicht mehr geändert werden) und eine Liste veränderlich (Sie können anhängen, ändern, subtrahieren usw.).

Also neige ich dazu, meine Tupel Dinge zu machen, die sich nach der Zuweisung nicht ändern sollten, und liste Dinge auf, die sich ändern lassen.

81
thornomad

Muss es veränderlich sein? Verwenden Sie eine Liste. Muss es nicht veränderlich sein? Verwenden Sie ein Tupel.

Ansonsten ist es eine Frage der Wahl.

Für Sammlungen heterogener Objekte (wie eine Adresse, die in Name, Straße, Stadt, Bundesland und Postleitzahl unterteilt ist) bevorzuge ich die Verwendung eines Tupels. Sie können immer leicht zu benannten Tupeln befördert werden.

Ebenso bevorzuge ich eine Liste, wenn die Auflistung wiederholt werden soll. Wenn es nur ein Container ist, der mehrere Objekte als einen enthält, bevorzuge ich ein Tupel.

42
AFoglia

Zunächst müssen Sie entscheiden, ob die Datenstruktur änderbar sein muss oder nicht. Wie bereits erwähnt, können Listen geändert werden, Tupel jedoch nicht. Dies bedeutet auch, dass Tupel für Wörterbuchschlüssel verwendet werden können, während Listen dies nicht können.

Nach meiner Erfahrung werden Tupel im Allgemeinen verwendet, wenn Reihenfolge und Position sinnvoll und konsistent sind. Beim Erstellen einer Datenstruktur für ein eigenes Abenteuerspiel habe ich beispielsweise Tupel anstelle von Listen verwendet, da die Position im Tupel von Bedeutung war. Hier ist ein Beispiel aus dieser Datenstruktur:

pages = {'foyer': {'text' : "some text", 
          'choices' : [('open the door', 'Rainbow'),
                     ('go left into the kitchen', 'bottomless pit'),
                     ('stay put','foyer2')]},}

Die erste Position im Tupel ist die Auswahl, die dem Benutzer angezeigt wird, wenn er das Spiel spielt, und die zweite Position ist der Schlüssel der Seite, zu der die Auswahl wechselt. Dies gilt für alle Seiten.

Tupel sind auch speichereffizienter als Listen, obwohl ich nicht sicher bin, wann dieser Vorteil offensichtlich wird.

Lesen Sie auch die Kapitel in Listen und Tupeln in Think Python .

14
Amanda Nyren

Aber wenn ich derjenige bin, der die API entwirft und die Datentypen auswählen kann, wie lauten dann die Richtlinien?

Für Eingabeparameter ist es am besten, die allgemeinste Schnittstelle zu akzeptieren, die das tut, was Sie benötigen. Es ist selten nur ein Tupel oder eine Liste - häufiger ist es eine Sequenz, die aufgeschnitten oder sogar iteriert werden kann. Pythons Duck-Typisierung ist normalerweise kostenlos, es sei denn, Sie überprüfen explizit die Eingabetypen. Tun Sie das nur, wenn es absolut unvermeidlich ist.

Für die von Ihnen erzeugten Daten (Ausgabeparameter) geben Sie einfach das zurück, was für Sie am bequemsten ist, z. Geben Sie den Datentyp zurück, den Sie behalten, oder was auch immer Ihre Hilfsfunktion zurückgibt.

Eine Sache, die Sie beachten sollten, ist, zu vermeiden, dass Sie eine Liste (oder eine andere veränderbare) zurückgeben, die Teil Ihres Staates ist, z.

class ThingsKeeper
    def __init__(self):
        self.__things = []

    def things(self):
        return self.__things  #outside objects can now modify your state

    def safer(self):
        return self.__things[:]  #it's copy-on-write, shouldn't hurt performance
11
Rafał Dowgird

Ein kleiner, aber bemerkenswerter Vorteil einer Liste gegenüber einem Tupel ist, dass Listen tendenziell etwas portabler sind. Standardtools unterstützen mit geringerer Wahrscheinlichkeit Tupel. JSON hat beispielsweise keinen Tupel-Typ. YAML tut dies, aber seine Syntax ist im Vergleich zu seiner Listensyntax, die ziemlich gut ist, hässlich.

In diesen Fällen möchten Sie möglicherweise ein Tupel intern verwenden und dann im Rahmen eines Exportvorgangs in eine Liste konvertieren. Alternativ können Sie Listen überall verwenden, um die Konsistenz zu gewährleisten.

2
Doug F