是否保证Python列表的元素保持按插入顺序排列?

时间:2012-12-04 00:09:27

标签: python

如果我有以下Python代码

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

x保证永远是[1,2,3],还是其他临时元素的排序?

7 个答案:

答案 0 :(得分:402)

是的,python列表中元素的顺序是持久的。

答案 1 :(得分:72)

简而言之,是的,订单得以保留。长期:

通常,以下定义将始终适用于列表等对象:

列表是一组元素,可以包含重复的元素,并且具有定义的顺序,除非明确指示,否则通常不会更改。 堆栈队列都是列表类型,它们为添加和删除元素提供特定(通常是有限的)行为(堆栈为LIFO,队列为FIFO)。列表是事物列表的实际表示。字符串可以被视为字符列表,因为顺序很重要("abc" != "bca")并且当然允许字符串内容中的重复项("aaa"可以存在并且!= "a"

集合是一组元素,它们不能包含重复项,并且具有可能会或可能不会随时间变化的非确定顺序。集合不代表事物列表,而是描述某些事物的范围。集合的内部结构,其元素如何相对于彼此存储,通常并不意味着传达有用的信息。在一些实现中,集合总是在内部排序;在其他情况下,排序只是未定义(通常取决于散列函数)。

集合是一个通用术语,指的是用于存储(通常是可变的)其他对象数量的任何对象。列表和集合都是一种集合。元组和数组通常不被视为集合。有些语言也认为 maps (描述不同对象之间关联的容器)也是一种集合。

这种命名方案适用于我所知道的所有编程语言,包括Python,C ++,Java,C#和Lisp(其中不保持秩序的列表特别具有灾难性)。如果有人知道任何情况并非如此,请说出来,我会编辑我的答案。请注意,特定实现可能会使用这些对象的其他名称,例如C ++中的 vector 和ALGOL 68中的 flex (两个列表; flex在技术上只是一个可调整大小的数组)

如果您的案例中由于+符号在此处的工作原理的具体情况而存在任何混淆,请仅知道订单重要列表,除非有充分理由相信否则你几乎总能安全地假设列表操作保持秩序。在这种情况下,+符号的行为与字符串(实际上只是字符列表)非常相似:它采用列表的内容并将其置于另一个列表的内容之后。

如果我们有

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

然后

list1 + list2

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

评估为

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

很像

"abdcde" + "fghijk"

制作

"abdcdefghijk"

答案 2 :(得分:5)

你混淆了'套'和'清单'。套装不保证订单,但是列表可以。

使用大括号声明集合:{}。相反,列表使用方括号声明:[]

mySet = {a, b, c, c}

不保证订单,但列表确实:

myList = [a, b, c]

答案 3 :(得分:3)

我想可能与你有关的一件事是,条目是否可以改变,例如,2会变成不同的数字。你可以在这里放心,因为在Python中,整数是不可变的,这意味着它们在创建后无法改变。

但并非Python中的所有内容都是不可变的。例如,列表是可变的 - 它们可以在创建后更改。例如,如果你有一个列表列表

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

在这里,我更改了a的第一个条目(我向其添加了7)。如果你不小心的话,可以想象一下这里的东西,并在这里得到意想不到的东西(事实上,当他们以某种方式开始用Python编程时,这确实发生在每个人身上;只是搜索这个网站“在循环时修改一个列表它“看到几十个例子”。

值得指出的是,x = x + [a]x.append(a)不是一回事。第二个变异x,第一个创建一个新列表并将其分配给x。要查看差异,请尝试设置y = x,然后向x添加任何内容并尝试每个内容,并查看两者对y的差异。

答案 4 :(得分:1)

是的,除非您对其执行其他操作,否则列表将保持为 [1,2,3]。

答案 5 :(得分:0)

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

aList

[2]

道德是在修改由列表驱动的循环中的列表时,需要两个步骤:

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]

答案 6 :(得分:0)

列表和元组总是在字典不是

时排序