Une liste Python est-elle garantie que ses éléments restent dans l'ordre dans lequel ils sont insérés?

318

Si j'ai le code Python suivant

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

Sera-t-il xtoujours garanti [1,2,3], ou d'autres ordonnances d'éléments provisoires sont-elles possibles?

samoz
la source

Réponses:

480

Oui, l'ordre des éléments dans une liste python est persistant.

sge
la source
17
C'est la bonne réponse, donc je ne veux pas en ajouter une autre. Il pourrait également utiliser list.append pour vraiment mettre son esprit à l'aise. docs.python.org/2/tutorial/datastructures.html
NG.
1
que se passe-t-il si je renvoie une liste locale à partir d'une fonction et que je l'utilise dans la fonction d'appel. C'est def fn_1(): lst = [] lst.append(1) lst.append(2) return lstet def fn_2(): print(fn_1())la commande sera-t-elle TOUJOURS la même quel que soit le nombre de fois ou où j'utilise fn_1 ()?
TheCuriousOne
6
Oui, l'ordre des éléments dans une liste python est persistant. ;)
sge
82

Bref, oui, l'ordre est préservé. En long:

En général, les définitions suivantes s'appliquent toujours aux objets tels que les listes:

Une liste est une collection d'éléments qui peut contenir des éléments en double et a un ordre défini qui ne change généralement pas sauf si explicitement fait pour le faire. les piles et les files d'attente sont deux types de listes qui fournissent un comportement spécifique (souvent limité) pour ajouter et supprimer des éléments (les piles étant LIFO, les files d'attente étant FIFO). Les listes sont des représentations pratiques, enfin, des listes de choses. Une chaîne peut être considérée comme une liste de caractères, car l'ordre est important ( "abc" != "bca") et les doublons dans le contenu de la chaîne sont certainement autorisés ( "aaa"peuvent exister et != "a").

Un ensemble est une collection d'éléments qui ne peuvent pas contenir de doublons et a un ordre non défini qui peut ou non changer avec le temps. Les ensembles ne représentent pas tant des listes de choses qu'ils décrivent l' étendue d'une certaine sélection de choses. La structure interne de l'ensemble, comment ses éléments sont stockés les uns par rapport aux autres, n'est généralement pas destinée à transmettre des informations utiles. Dans certaines implémentations, les ensembles sont toujours triés en interne; dans d'autres, l'ordre n'est tout simplement pas défini (généralement en fonction d'une fonction de hachage).

Collection est un terme générique faisant référence à tout objet utilisé pour stocker un nombre (généralement variable) d'autres objets. Les listes et les ensembles sont un type de collection. Les tuples et les tableaux ne sont normalement pas considérés comme des collections. Certaines langues considèrent également les cartes (conteneurs qui décrivent les associations entre différents objets) comme un type de collection.

Ce schéma de dénomination est valable pour tous les langages de programmation que je connais, y compris Python, C ++, Java, C # et Lisp (dans lesquels les listes ne conservant pas leur ordre seraient particulièrement catastrophiques). Si quelqu'un en connaît un où ce n'est pas le cas, veuillez simplement le dire et je modifierai ma réponse. Notez que des implémentations spécifiques peuvent utiliser d'autres noms pour ces objets, comme vector en C ++ et flex dans ALGOL 68 (les deux listes; flex n'est techniquement qu'un tableau redimensionnable).

S'il y a une confusion dans votre cas en raison des détails de la façon dont le +signe fonctionne ici, sachez que l'ordre est important pour les listes et à moins qu'il n'y ait de très bonnes raisons de croire le contraire, vous pouvez presque toujours supposer que les opérations de liste préservent l'ordre . Dans ce cas, le +signe se comporte comme il le fait pour les chaînes (qui sont vraiment juste des listes de caractères de toute façon): il prend le contenu d'une liste et le place derrière le contenu d'un autre.

Si nous avons

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

ensuite

list1 + list2

Est le même que

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

Qui évalue à

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

Un peu comme

"abdcde" + "fghijk"

Produit

"abdcdefghijk"
ApprocheObscuritéPoisson
la source
1
J'ai lu quelque part que, puisque la spécification d'un tableau JSON ne spécifie pas que les tableaux maintiennent l'ordre, les opérations de tableau ne sont pas garanties de maintenir l'ordre. Mais je ne trouve pas la source de cela. Et la structure sous-jacente d'un tableau est toujours un cas particulier d'un objet avec des index numérotés, donc ce n'est pas une contradiction avec votre déclaration, juste une friandise intéressante, je pensais.
Multihunter
1
Je ne suis pas d'accord avec l'explication de l'ensemble. Les ensembles ne sont certainement pas "plus orientés vers des buts mathématiques et théoriques que ceux réels". Au lieu de cela, les ensembles sont très utiles chaque fois que l'on a besoin d'une collection contenant des éléments qui ne peuvent pas être répétés, et offrent des outils tels que la différence et l'intersection qui sont utiles dans la modélisation de cas d'utilisation réels.
Pintun
1
@Pintun regarde en arrière plusieurs années après avoir écrit cet article, je suis d'accord avec vous. J'éditerai une fois que je trouverai une meilleure façon d'exprimer ce que je visais.
ApproachingDarknessFish
5

Vous confondez «ensembles» et «listes». Un ensemble ne garantit pas l'ordre, mais les listes le font.

Les ensembles sont déclarées en utilisant des accolades: {}. En revanche, les listes sont déclarées en utilisant des crochets: [].

mySet = {a, b, c, c}

Ne garantit pas la commande, mais la liste:

myList = [a, b, c]
Jonathan Muckell
la source
1
Notez qu'un ensemble garantit également la non-duplication. Une liste peut avoir des éléments en double, pas un ensemble.
Nathaniel Ford
4

Je suppose qu'une chose qui peut vous préoccuper est de savoir si les entrées pourraient changer, de sorte que le 2 devienne un nombre différent, par exemple. Vous pouvez mettre votre esprit à l'aise ici, car en Python, les entiers sont immuables , ce qui signifie qu'ils ne peuvent pas changer après leur création.

Cependant, tout en Python n'est pas immuable. Par exemple, les listes sont modifiables --- elles peuvent changer après avoir été créées. Ainsi, par exemple, si vous aviez une liste de listes

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

Ici, j'ai changé la première entrée de a(je l'ai ajouté 7). On pourrait imaginer mélanger les choses et obtenir des choses inattendues ici si vous ne faites pas attention (et en effet, cela arrive à tout le monde quand ils commencent à programmer en Python d'une manière ou d'une autre; il suffit de rechercher sur ce site pour "modifier une liste pendant la boucle") "pour voir des dizaines d'exemples).

Il convient également de le souligner x = x + [a]et ce x.append(a)n'est pas la même chose. Le second mute xet le premier crée une nouvelle liste et l'affecte à x. Pour voir la différence, essayez de régler y = xavant d'ajouter quoi que ce soit xet d'essayer chacun, et regardez la différence que les deux font y.

asmeurer
la source
0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

une liste

[2]

La morale est que lorsque la modification d'une liste dans une boucle pilotée par la liste, prend deux étapes:

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]
garçon de Ralphie
la source
0

Oui, les listes et les tuples sont toujours classés alors que les dictionnaires ne le sont pas

Ysh
la source
1
Sauf en Python 3: D
mbeacom