¿Se garantiza que una lista de Python tenga sus elementos en el orden en que se insertan?

318

Si tengo el siguiente código de Python

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

¿ xSe garantizará que siempre sea así [1,2,3], o son posibles otros ordenamientos de los elementos provisionales?

Samoz
fuente

Respuestas:

480

Sí, el orden de los elementos en una lista de Python es persistente.

sge
fuente
17
Esta es la respuesta correcta, así que no quiero agregar otra. También podría usar list.append para tranquilizarse realmente. docs.python.org/2/tutorial/datastructures.html
NG.
1
¿Qué pasa si devuelvo una lista local de una función y la uso en la función de llamada? Es decir def fn_1(): lst = [] lst.append(1) lst.append(2) return lst, y def fn_2(): print(fn_1())Si la orden será siempre igual, independientemente de cuántas veces o donde quiera que utilizo fn_1 ()?
TheCuriousOne
66
Sí, el orden de los elementos en una lista de Python es persistente. ;)
sge
82

En resumen, sí, el orden se conserva. En mucho tiempo:

En general, las siguientes definiciones siempre se aplicarán a objetos como listas:

Una lista es una colección de elementos que pueden contener elementos duplicados y tiene un orden definido que generalmente no cambia a menos que se haga explícitamente. las pilas y las colas son dos tipos de listas que proporcionan un comportamiento específico (a menudo limitado) para agregar y eliminar elementos (las pilas son LIFO, las colas son FIFO). Las listas son representaciones prácticas de, bueno, listas de cosas. Una cadena puede considerarse como una lista de caracteres, ya que el orden es importante ( "abc" != "bca") y los duplicados en el contenido de la cadena son ciertamente permitidos ( "aaa"pueden existir y != "a").

Un conjunto es una colección de elementos que no pueden contener duplicados y tiene un orden no definido que puede o no cambiar con el tiempo. Los conjuntos no representan listas de cosas tanto como describen el alcance de una determinada selección de cosas. La estructura interna del conjunto, cómo se almacenan sus elementos uno con respecto al otro, generalmente no pretende transmitir información útil. En algunas implementaciones, los conjuntos siempre se ordenan internamente; en otros, el orden es simplemente indefinido (generalmente depende de una función hash).

Colección es un término genérico que se refiere a cualquier objeto utilizado para almacenar un número (generalmente variable) de otros objetos. Tanto las listas como los conjuntos son un tipo de colección. Tuplas y matrices normalmente no se consideran colecciones. Algunos idiomas consideran que los mapas (contenedores que describen asociaciones entre diferentes objetos) también son un tipo de colección.

Este esquema de nombres es válido para todos los lenguajes de programación que conozco, incluidos Python, C ++, Java, C # y Lisp (en el que las listas que no mantienen su orden serían particularmente catastróficas). Si alguien sabe de dónde no es este el caso, solo dígalo y editaré mi respuesta. Tenga en cuenta que las implementaciones específicas pueden usar otros nombres para estos objetos, como vector en C ++ y flex en ALGOL 68 (ambas listas; flex es técnicamente solo una matriz redimensionable).

Si queda alguna confusión en su caso debido a los detalles de cómo funciona el +letrero aquí, solo sepa que el orden es importante para las listas y, a menos que haya una buena razón para creer lo contrario, puede suponer que las operaciones de la lista preservan el orden . En este caso, el +signo se comporta de manera muy similar a las cadenas (que en realidad son solo listas de caracteres de todos modos): toma el contenido de una lista y la coloca detrás del contenido de otra.

Si tenemos

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

Luego

list1 + list2

Es lo mismo que

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

Que se evalúa como

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

Muy parecido

"abdcde" + "fghijk"

Produce

"abdcdefghijk"
Acercarse Oscuridad Peces
fuente
1
Leí en alguna parte que, dado que la especificación de una matriz JSON no especifica que las matrices mantienen el orden, no se garantiza que las operaciones de la matriz mantengan el orden. Sin embargo, no puedo encontrar la fuente para eso. Y la estructura subyacente de una matriz sigue siendo un caso especial de un objeto con índices numerados, por lo que no es una contradicción con su declaración, solo un dato interesante, pensé.
Multihunter
1
No estoy de acuerdo con la explicación del conjunto. Los conjuntos definitivamente no están "orientados más hacia propósitos matemáticos y teóricos que los de la vida real". En cambio, los conjuntos son muy útiles cada vez que se necesita una colección que contenga elementos que no se pueden repetir, y ofrecen herramientas como la diferencia y la intersección que son útiles para modelar casos de uso de la vida real.
Pintun
1
@Pintun mirando hacia atrás varios años después de escribir esta publicación, estoy de acuerdo contigo. Lo editaré una vez que encuentre una mejor manera de expresar lo que estaba apuntando.
ApproachingDarknessFish
5

Estás confundiendo 'conjuntos' y 'listas'. Un conjunto no garantiza el orden, pero las listas sí.

Los conjuntos se declaran usando llaves: {}. Por el contrario, las listas se declaran utilizando corchetes: [].

mySet = {a, b, c, c}

No garantiza el orden, pero la lista sí:

myList = [a, b, c]
Jonathan Muckell
fuente
1
Tenga en cuenta que un conjunto también garantiza la no duplicación. Una lista puede tener elementos duplicados, un conjunto puede no tenerlos.
Nathaniel Ford
4

Supongo que una cosa que puede preocuparte es si las entradas podrían cambiar o no, de modo que el 2 se convierta en un número diferente, por ejemplo. Puede tranquilizarse aquí, porque en Python, los enteros son inmutables , lo que significa que no pueden cambiar una vez creados.

Sin embargo, no todo en Python es inmutable. Por ejemplo, las listas son mutables, pueden cambiar después de ser creadas. Entonces, por ejemplo, si tuviera una lista de listas

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

Aquí, cambié la primera entrada de a(agregué 7). Uno podría imaginarse barajando las cosas y obteniendo cosas inesperadas aquí si no tiene cuidado (y, de hecho, esto le sucede a todos cuando comienzan a programar en Python de una forma u otra; solo busque en este sitio "modificar una lista mientras recorre el bucle "para ver docenas de ejemplos).

También vale la pena señalar eso x = x + [a]y x.append(a)no son lo mismo. El segundo muta xy el primero crea una nueva lista y se la asigna x. Para ver la diferencia, intente configurar y = xantes de agregar algo xy probar cada uno, y observe la diferencia que hacen los dos y.

asmeurer
fuente
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

una lista

[2]

La moraleja es que al modificar una lista en un bucle conducido por la lista, se toman dos pasos:

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]
chico ralphie
fuente
0

Sí, las listas y las tuplas siempre se ordenan mientras que los diccionarios no

Ysh
fuente
1
Excepto en Python 3: D
mbeacom