Wird bei einer Python-Liste garantiert, dass ihre Elemente in der Reihenfolge bleiben, in der sie eingefügt wurden?

317

Wenn ich den folgenden Python-Code habe

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

Wird xgarantiert immer sein [1,2,3], oder sind andere Ordnungen der Zwischenelemente möglich?

Samoz
quelle

Antworten:

478

Ja, die Reihenfolge der Elemente in einer Python-Liste bleibt bestehen.

sge
quelle
16
Dies ist die richtige Antwort, daher möchte ich keine weitere hinzufügen. Er könnte auch list.append verwenden, um sich wirklich zu beruhigen. docs.python.org/2/tutorial/datastructures.html
NG.
1
Was ist, wenn ich eine lokale Liste von einer Funktion zurückgebe und diese in der aufrufenden Funktion verwende? Das heißt def fn_1(): lst = [] lst.append(1) lst.append(2) return lstund def fn_2(): print(fn_1())wird die Reihenfolge IMMER gleich sein, unabhängig davon, wie oft oder wo immer ich fn_1 () verwende?
TheCuriousOne
6
Ja, die Reihenfolge der Elemente in einer Python-Liste bleibt bestehen. ;)
sge
81

Kurz gesagt, ja, die Reihenfolge bleibt erhalten. In Kürze:

Im Allgemeinen gelten die folgenden Definitionen immer für Objekte wie Listen:

Eine Liste ist eine Sammlung von Elementen, die doppelte Elemente enthalten können und eine definierte Reihenfolge haben, die sich im Allgemeinen nur ändert, wenn dies ausdrücklich vorgesehen ist. Stapel und Warteschlangen sind beide Arten von Listen, die ein spezifisches (häufig eingeschränktes) Verhalten zum Hinzufügen und Entfernen von Elementen bieten (Stapel sind LIFO, Warteschlangen sind FIFO). Listen sind praktische Darstellungen von Listen von Dingen. Eine Zeichenfolge kann als Liste von Zeichen betrachtet werden, da die Reihenfolge wichtig ist ( "abc" != "bca") und Duplikate im Inhalt der Zeichenfolge durchaus zulässig sind (vorhanden sein "aaa"können und != "a").

Ein Satz ist eine Sammlung von Elementen, die keine Duplikate enthalten können und eine unbestimmte Reihenfolge haben, die sich im Laufe der Zeit ändern kann oder nicht. Sets stellen weniger Listen von Dingen dar, als vielmehr das Ausmaß einer bestimmten Auswahl von Dingen. Die interne Struktur der Menge, wie ihre Elemente relativ zueinander gespeichert werden, soll normalerweise keine nützlichen Informationen vermitteln. In einigen Implementierungen werden Mengen immer intern sortiert. In anderen Fällen ist die Reihenfolge einfach undefiniert (normalerweise abhängig von einer Hash-Funktion).

Sammlung ist ein Oberbegriff für jedes Objekt, das zum Speichern einer (normalerweise variablen) Anzahl anderer Objekte verwendet wird. Sowohl Listen als auch Sets sind eine Art Sammlung. Tupel und Arrays gelten normalerweise nicht als Sammlungen. Einige Sprachen betrachten Karten (Container, die Assoziationen zwischen verschiedenen Objekten beschreiben) ebenfalls als eine Art Sammlung.

Dieses Namensschema gilt für alle mir bekannten Programmiersprachen, einschließlich Python, C ++, Java, C # und Lisp (wobei Listen, deren Reihenfolge nicht eingehalten wird, besonders katastrophal wären). Wenn jemand weiß, wo dies nicht der Fall ist, sagen Sie es einfach und ich werde meine Antwort bearbeiten. Beachten Sie, dass bestimmte Implementierungen möglicherweise andere Namen für diese Objekte verwenden, z. B. Vektor in C ++ und Flex in ALGOL 68 (beide Listen; Flex ist technisch gesehen nur ein anpassbares Array).

Wenn in Ihrem Fall aufgrund der Besonderheiten der Funktionsweise des +Zeichens noch Verwirrung herrscht , wissen Sie einfach, dass die Reihenfolge für Listen wichtig ist. Wenn kein Grund zu der Annahme besteht , dass dies nicht der Fall ist, können Sie so gut wie immer davon ausgehen, dass Listenoperationen die Reihenfolge beibehalten . In diesem Fall +verhält sich das Zeichen ähnlich wie bei Zeichenfolgen (die eigentlich nur Listen von Zeichen sind): Es nimmt den Inhalt einer Liste und platziert ihn hinter dem Inhalt einer anderen.

Wenn wir haben

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

Dann

list1 + list2

Ist das gleiche wie

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

Welches bewertet zu

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Ähnlich wie

"abdcde" + "fghijk"

Produziert

"abdcdefghijk"
Annäherung an DarknessFish
quelle
1
Ich habe irgendwo gelesen, dass, da die Spezifikation eines JSON-Arrays nicht angibt, dass Arrays die Reihenfolge beibehalten, die Array-Operationen nicht garantiert die Reihenfolge beibehalten. Ich kann die Quelle dafür jedoch nicht finden. Und die zugrunde liegende Struktur eines Arrays ist immer noch ein Sonderfall eines Objekts mit nummerierten Indizes. Es ist also kein Widerspruch zu Ihrer Aussage, sondern nur ein interessanter Leckerbissen, dachte ich.
Multihunter
1
Ich bin mit der Erklärung des Satzes nicht einverstanden. Sets sind definitiv nicht "mehr auf mathematische und theoretische Zwecke ausgerichtet als auf reale". Stattdessen sind Sets immer dann sehr nützlich, wenn eine Sammlung mit Elementen benötigt wird, die nicht wiederholt werden können, und bieten Tools wie Differenz und Schnittmenge, die bei der Modellierung realer Anwendungsfälle hilfreich sind.
Pintun
1
@ Pintun Rückblick einige Jahre nach dem Schreiben dieses Beitrags stimme ich Ihnen zu. Ich werde bearbeiten, sobald ich einen besseren Weg gefunden habe, um auszudrücken, was ich anstrebte.
Annäherung an
5

Sie verwechseln 'Sets' und 'Listen'. Ein Set garantiert keine Bestellung, Listen jedoch.

Sätze werden in geschweiften Klammern deklariert : {}. Im Gegensatz dazu werden Listen in eckigen Klammern deklariert : [].

mySet = {a, b, c, c}

Garantiert keine Bestellung, aber die Liste:

myList = [a, b, c]
Jonathan Muckell
quelle
1
Beachten Sie, dass ein Satz auch die Nichtduplizierung garantiert. Eine Liste kann doppelte Elemente enthalten, eine Menge möglicherweise nicht.
Nathaniel Ford
4

Ich nehme an, eine Sache, die Sie betreffen könnte, ist, ob sich die Einträge ändern könnten oder nicht, so dass die 2 beispielsweise eine andere Zahl wird. Sie können sich hier beruhigen, denn in Python sind Ganzzahlen unveränderlich , was bedeutet, dass sie sich nach ihrer Erstellung nicht ändern können.

Nicht alles in Python ist jedoch unveränderlich. Listen sind beispielsweise veränderbar - sie können sich nach dem Erstellen ändern. Zum Beispiel, wenn Sie eine Liste von Listen hatten

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

Hier habe ich den ersten Eintrag von geändert a(ich habe ihn hinzugefügt 7). Man könnte sich vorstellen, Dinge herumzumischen und hier unerwartete Dinge zu bekommen, wenn man nicht aufpasst (und dies passiert in der Tat jedem, wenn er auf die eine oder andere Weise mit dem Programmieren in Python beginnt; suchen Sie einfach auf dieser Site nach "Ändern einer Liste während des Durchlaufens" es "Dutzende von Beispielen zu sehen).

Es ist auch erwähnenswert, dass x = x + [a]und x.append(a)ist nicht dasselbe. Der zweite mutiert x, und der erste erstellt eine neue Liste und weist sie zu x. Um den Unterschied zu erkennen, versuchen Sie es mit Einstellungen, y = xbevor Sie etwas hinzufügen xund versuchen, und sehen Sie sich den Unterschied an, den die beiden ausmachen y.

asmeurer
quelle
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

eine Liste

[2]

Die Moral besteht darin, beim Ändern einer Liste in einer von der Liste gesteuerten Schleife zwei Schritte auszuführen:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]
Ralphie Junge
quelle
0

Ja, Listen und Tupel werden immer bestellt, Wörterbücher nicht

Ysh
quelle
1
Außer in Python 3: D
mbeacom