Un elenco Python garantisce che i suoi elementi rimangano nell'ordine in cui sono inseriti?


318

Se ho il seguente codice Python

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

Sarà xgarantito per essere sempre [1,2,3], o sono possibili altri ordini degli elementi provvisori?

Risposte:


480

Sì, l'ordine degli elementi in un elenco Python è persistente.


17
Questa è la risposta giusta, quindi non voglio aggiungerne un'altra. Poteva anche usare list.append per calmare davvero la mente. docs.python.org/2/tutorial/datastructures.html
NG.

1
cosa succede se restituisco un elenco locale da una funzione e lo uso nella funzione chiamante. Cioè def fn_1(): lst = [] lst.append(1) lst.append(2) return lste def fn_2(): print(fn_1())l'ordine sarà sempre lo stesso indipendentemente da quante volte o dove mai uso fn_1 ()?
TheCuriousOne il

6
Sì, l'ordine degli elementi in un elenco Python è persistente. ;)
sge

82

In breve, sì, l'ordine è conservato. A lungo:

In generale, le seguenti definizioni si applicheranno sempre agli oggetti come gli elenchi:

Un elenco è una raccolta di elementi che può contenere elementi duplicati e ha un ordine definito che generalmente non cambia se non esplicitamente fatto per farlo. gli stack e le code sono entrambi tipi di elenchi che forniscono comportamenti specifici (spesso limitati) per l'aggiunta e la rimozione di elementi (gli stack sono LIFO, le code sono FIFO). Gli elenchi sono rappresentazioni pratiche di elenchi di cose. Una stringa può essere pensata come un elenco di caratteri, poiché l'ordine è importante ( "abc" != "bca") e i duplicati nel contenuto della stringa sono certamente consentiti ( "aaa"possono esistere e != "a").

Un set è una raccolta di elementi che non può contenere duplicati e ha un ordine non definito che può o non può cambiare nel tempo. Gli insiemi non rappresentano elenchi di cose tanto quanto descrivono l' estensione di una certa selezione di cose. La struttura interna dell'insieme, il modo in cui i suoi elementi sono memorizzati l'uno rispetto all'altro, di solito non ha lo scopo di trasmettere informazioni utili. In alcune implementazioni, i set sono sempre ordinati internamente; in altri l'ordinamento è semplicemente indefinito (di solito dipende da una funzione hash).

Raccolta è un termine generico che si riferisce a qualsiasi oggetto utilizzato per memorizzare un numero (di solito variabile) di altri oggetti. Sia gli elenchi che i set sono un tipo di raccolta. Le tuple e le matrici normalmente non sono considerate raccolte. Alcune lingue considerano anche le mappe (contenitori che descrivono le associazioni tra oggetti diversi) come un tipo di raccolta.

Questo schema di denominazione è valido per tutti i linguaggi di programmazione che conosco, compresi Python, C ++, Java, C # e Lisp (in cui gli elenchi che non mantengono il loro ordine sarebbero particolarmente catastrofici). Se qualcuno è a conoscenza di casi in cui non è così, per favore basta dirlo e io modificherò la mia risposta. Notare che implementazioni specifiche possono usare altri nomi per questi oggetti, come vector in C ++ e flex in ALGOL 68 (entrambi gli elenchi; flex è tecnicamente solo un array ridimensionabile).

Se nel tuo caso è rimasta confusione a causa delle specifiche di come funziona il +segno qui, sappi solo che l'ordine è importante per gli elenchi e, a meno che non ci siano ottime ragioni per credere, altrimenti puoi sempre presumere che le operazioni dell'elenco mantengano l'ordine . In questo caso, il +segno si comporta in modo molto simile alle stringhe (che in realtà sono solo elenchi di caratteri): prende il contenuto di un elenco e lo posiziona dietro il contenuto di un altro.

Se abbiamo

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

Poi

list1 + list2

Equivale a

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

Che valuta

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

Molto simile

"abdcde" + "fghijk"

produce

"abdcdefghijk"

1
Ho letto da qualche parte che poiché le specifiche di un array JSON non specificano che gli array mantengono l'ordine, le operazioni dell'array non sono garantite per mantenere l'ordine. Non riesco a trovare la fonte per quello, però. E la struttura di base di un array è ancora un caso speciale di un oggetto con indici numerati, quindi non è una contraddizione alla tua affermazione, solo un bocconcino interessante, ho pensato.
Multihunter l'

1
Non sono d'accordo con la spiegazione del set. I set non sono sicuramente "orientati più verso scopi matematici e teorici di quelli della vita reale". Al contrario, i set sono molto utili ogni volta che è necessaria una raccolta contenente elementi che non possono essere ripetuti e offrono strumenti come la differenza e l'intersezione che sono utili nella modellazione dei casi d'uso della vita reale.
Pintun,

1
@Pintun guardando indietro diversi anni dopo aver scritto questo post sono d'accordo con te. Modificherò una volta che avrò un modo migliore per esprimere ciò a cui stavo puntando.
ApproachingDarknessFish

5

Stai confondendo 'set' ed 'elenchi'. Un set non garantisce l'ordine, ma gli elenchi lo fanno.

Imposta vengono dichiarate utilizzando parentesi graffe: {}. Al contrario, le liste vengono dichiarate utilizzando parentesi quadre: [].

mySet = {a, b, c, c}

Non garantisce l'ordine, ma l'elenco fa:

myList = [a, b, c]

1
Si noti che un set garantisce anche la non duplicazione. Un elenco può contenere elementi duplicati, un insieme no.
Nathaniel Ford,

4

Suppongo che una cosa che potrebbe interessarti sia se le voci potrebbero cambiare o meno, in modo che il 2 diventi un numero diverso, per esempio. Qui puoi tranquillizzare la tua mente, perché in Python gli interi sono immutabili , il che significa che non possono cambiare dopo che sono stati creati.

Tuttavia, non tutto in Python è immutabile. Ad esempio, gli elenchi sono modificabili --- possono cambiare dopo essere stati creati. Ad esempio, se avessi un elenco di elenchi

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

Qui, ho modificato la prima voce di a(l'ho aggiunta 7). Si potrebbe immaginare di mescolare cose in giro e ottenere cose inaspettate qui se non si sta attenti (e in effetti, questo accade a tutti quando iniziano a programmare in Python in un modo o nell'altro; basta cercare su questo sito "modificando un elenco mentre si scorre in loop "per vedere dozzine di esempi).

E 'anche la pena sottolineare che x = x + [a]e x.append(a)non sono la stessa cosa. Il secondo muta xe il primo crea un nuovo elenco e lo assegna a x. Per vedere la differenza, prova a impostare y = xprima di aggiungere qualsiasi cosa xe provare ognuna e guarda la differenza che fanno i due y.


0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

una lista

[2]

La morale è quando si modifica un elenco in un ciclo guidato dall'elenco, si procede in due passaggi:

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]

0

Sì, elenchi e tuple sono sempre ordinati mentre i dizionari no


1
Tranne in Python 3: D
mbeacom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.