是否可以保证Python列表的元素保持其插入顺序不变?


318

如果我有以下Python代码

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

x保证始终是[1,2,3],或者是临时元件的其他排序可能吗?

Answers:


479

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


17
这是正确的答案,所以我不想添加其他答案。他还可以使用list.append来使自己的想法真正放松。 docs.python.org/2/tutorial/datastructures.html
NG。

1
如果我从函数返回本地列表并在调用函数中使用该列表,该怎么办?也就是说def fn_1(): lst = [] lst.append(1) lst.append(2) return lstdef fn_2(): print(fn_1())无论我使用fn_1()多少次或在哪里使用,顺序都将始终相同吗?
TheCuriousOne

6
是的,python列表中元素的顺序是持久的。;)
sge

82

简而言之,是的,顺序被保留。总而言之:

通常,以下定义将始终应用于列表之类的对象:

一个列表是一个可以包含重复的元素,并具有已定义的顺序通常不会改变,除非明确做这样的元素的集合。堆栈队列都是列表的两种类型,它们为添加和删除元素提供了特定的(通常是有限的)行为(堆栈为LIFO,队列为FIFO)。列表是事物列表的实际表示。可以将字符串视为字符列表,因为顺序很重要("abc" != "bca"),并且肯定允许字符串内容重复("aaa"可以存在和!= "a")。

是不能包含重复元素的集合,并且具有可以或可以不随时间而改变的非定顺序。集不代表事物列表,而是描述事物的某种选择的程度。集合的内部结构及其元素之间的相对存储方式通常并不意味着传达有用的信息。在某些实现中,集合始终在内部进行排序。在其他情况下,顺序只是不确定的(通常取决于哈希函数)。

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

这种命名方案适用于我所知道的所有编程语言,包括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"

1
我在某处读到,因为JSON数组的规范未指定数组保持顺序,所以不能保证数组操作可以保持顺序。不过,我找不到来源。而且,数组的基础结构仍然是带有编号索引的对象的特例,因此,我认为这与您的声明并不矛盾,只是一个有趣的花絮。
Multihunter 2016年

1
我不同意set的说明。集合绝对不是“比现实生活更适合数学和理论目的”。相反,集在任何时候需要一个包含无法重复的项目的集合时都非常有用,并且提供了诸如差异和交集之类的工具,这些工具可用于对实际用例进行建模。
Pintun

1
@Pintun在写这篇文章几年后回头,我同意你的看法。一旦找到更好的表达方式,我将进行编辑。
接近

5

您会混淆“集合”和“列表”。集合不能保证顺序,但列表可以保证顺序。

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

mySet = {a, b, c, c}

不保证订购,但列表可以:

myList = [a, b, c]

1
请注意,集合还可以保证不重复。列表可能有重复的元素,集合可能没有。
纳撒尼尔·福特

4

我想可能与您有关的一件事是条目是否可以更改,例如,使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


0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

一个列表

[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]

0

是的,列表和元组总是排序的,而字典不是


1
除了Python 3:D
mbeacom,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.