É garantida que uma lista Python mantenha seus elementos na ordem em que são inseridos?

318

Se eu tiver o seguinte código Python

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

Vai xser garantida como sempre [1,2,3], ou são outros ordenamentos dos elementos intercalares possível?

samoz
fonte

Respostas:

480

Sim, a ordem dos elementos em uma lista python é persistente.

sge
fonte
17
Esta é a resposta certa, por isso não quero adicionar outra. Ele também poderia usar o list.append para realmente deixar sua mente à vontade. docs.python.org/2/tutorial/datastructures.html
NG.
1
e se eu retornar uma lista local de uma função e usá-la na função de chamada. Ou seja, def fn_1(): lst = [] lst.append(1) lst.append(2) return lste def fn_2(): print(fn_1())o pedido será o mesmo SEMPRE, independentemente de quantas vezes ou onde eu sempre use fn_1 ()?
TheCuriousOne 25/11/16
6
Sim, a ordem dos elementos em uma lista python é persistente. ;)
sge 27/11
82

Em suma, sim, a ordem é preservada. Em muito tempo:

Em geral, as seguintes definições sempre se aplicam a objetos como listas:

Uma lista é uma coleção de elementos que podem conter elementos duplicados e tem uma ordem definida que geralmente não muda, a menos que seja explicitamente solicitado. pilhas e filas são os dois tipos de listas que fornecem um comportamento específico (geralmente limitado) para adicionar e remover elementos (pilhas sendo LIFO, filas sendo FIFO). Listas são representações práticas de, bem, listas de coisas. Uma string pode ser vista como uma lista de caracteres, pois a ordem é importante ( "abc" != "bca") e duplicatas no conteúdo da string são certamente permitidas ( "aaa"podem existir e != "a").

Um conjunto é uma coleção de elementos que não podem conter duplicatas e tem uma ordem não definida que pode ou não mudar ao longo do tempo. Os conjuntos não representam tanto listas de coisas quanto descrevem a extensão de uma certa seleção de coisas. A estrutura interna do conjunto, como seus elementos são armazenados um em relação ao outro, geralmente não se destina a transmitir informações úteis. Em algumas implementações, os conjuntos são sempre classificados internamente; em outros, a ordem é simplesmente indefinida (geralmente dependendo de uma função de hash).

Coleção é um termo genérico que se refere a qualquer objeto usado para armazenar um número (geralmente variável) de outros objetos. As listas e os conjuntos são um tipo de coleção. Tuplas e matrizes normalmente não são consideradas coleções. Algumas linguagens consideram mapas (contêineres que descrevem associações entre objetos diferentes) também um tipo de coleção.

Esse esquema de nomenclatura é válido para todas as linguagens de programação que eu conheço, incluindo Python, C ++, Java, C # e Lisp (nas quais as listas que não mantêm sua ordem seriam particularmente catastróficas). Se alguém souber de algum onde esse não seja o caso, diga-o e editarei minha resposta. Observe que implementações específicas podem usar outros nomes para esses objetos, como vetor em C ++ e flex no ALGOL 68 (ambas as listas; flex é tecnicamente apenas uma matriz redimensionável).

Se houver alguma confusão no seu caso devido às especificidades de como o +sinal funciona aqui, saiba que a ordem é importante para as listas e, a menos que haja muito boas razões para acreditar, você pode sempre assumir com segurança que as operações da lista preservam a ordem . Nesse caso, o +sinal se comporta da mesma maneira que para as strings (que na verdade são apenas listas de caracteres): pega o conteúdo de uma lista e o coloca atrás do conteúdo de outro.

Se tiver-mos

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

Então

list1 + list2

É o mesmo que

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

O que avalia como

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

Muito parecido

"abdcde" + "fghijk"

Produz

"abdcdefghijk"
AproximandoEscuridãoPeixe
fonte
1
Eu li em algum lugar que, como a especificação de uma matriz JSON não especifica que matrizes mantêm operações de matriz de ordem, não é garantido que elas mantenham a ordem. Não consigo encontrar a fonte disso, no entanto. E a estrutura subjacente de uma matriz ainda é um caso especial de um objeto com índices numerados; portanto, não é uma contradição à sua declaração, apenas um boato interessante, pensei.
Multihunter
1
Eu não concordo com a explicação do conjunto. Definitivamente, os conjuntos não são "voltados mais para fins matemáticos e teóricos do que para os da vida real". Em vez disso, os conjuntos são muito úteis sempre que for necessário uma coleção contendo itens que não podem ser repetidos e oferecem ferramentas como diferença e interseção que são úteis na modelagem de casos de uso da vida real.
Pintun
1
@Pintun olhando para trás vários anos depois de escrever este post, eu concordo com você. Vou editar assim que descobrir uma maneira melhor de expressar o que pretendia.
ApproachingDarknessFish
5

Você está confundindo 'conjuntos' e 'listas'. Um conjunto não garante ordem, mas as listas sim.

Sets são declaradas usando chaves: {}. Em contraste, as listas são declaradas usando colchetes: [].

mySet = {a, b, c, c}

Não garante a ordem, mas a lista:

myList = [a, b, c]
Jonathan Muckell
fonte
1
Observe que um conjunto também garante não duplicação. Uma lista pode ter elementos duplicados, um conjunto pode não.
22315 Nathaniel Ford
4

Suponho que uma coisa que possa lhe interessar é se as entradas podem ou não mudar, para que o 2 se torne um número diferente, por exemplo. Você pode colocar sua mente à vontade aqui, porque no Python, os números inteiros são imutáveis , o que significa que eles não podem mudar depois de serem criados.

Nem tudo no Python é imutável, no entanto. Por exemplo, as listas são mutáveis ​​- elas podem mudar após serem criadas. Por exemplo, se você tivesse uma lista de listas

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

Aqui, mudei a primeira entrada de a(adicionei 7a ela). Pode-se imaginar embaralhar coisas e obter coisas inesperadas aqui, se você não tomar cuidado (e, de fato, isso acontece com todo mundo quando eles começam a programar no Python de uma maneira ou de outra; basta procurar neste site "modificando uma lista enquanto percorre "para ver dezenas de exemplos).

Também vale ressaltar isso x = x + [a]e x.append(a)não é a mesma coisa. O segundo muda xe o primeiro cria uma nova lista e a atribui x. Para ver a diferença, tente definir y = xantes de adicionar qualquer coisa xe tentar cada uma delas e observe a diferença que as duas fazem y.

asmeurer
fonte
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

uma lista

[2]

A moral é que, ao modificar uma lista em um loop conduzido pela lista, é preciso dois passos:

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]
menino ralphie
fonte
0

Sim, listas e tuplas são sempre ordenadas, enquanto os dicionários não são

Ysh
fonte
1
Exceto em Python 3: D
mbeacom 27/04