问题:是否可以保证Python列表的元素保持其插入顺序不变?
如果我有以下Python代码
>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]
将x
保证始终是[1,2,3]
,或者是临时元件的其他排序可能吗?
回答 0
是的,python列表中元素的顺序是持久的。
回答 1
简而言之,是的,顺序被保留。总而言之:
通常,以下定义将始终应用于列表之类的对象:
一个列表是一个可以包含重复的元素,并具有已定义的顺序通常不会改变,除非明确做这样的元素的集合。堆栈和队列都是列表的两种类型,它们为添加和删除元素提供了特定的(通常是有限的)行为(堆栈为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"
回答 2
您会混淆“集合”和“列表”。集合不能保证顺序,但列表可以保证顺序。
集使用大括号声明:{}
。相反,列表使用方括号声明:[]
。
mySet = {a, b, c, c}
不保证订购,但列表可以:
myList = [a, b, c]
回答 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
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]
回答 5
是的,列表和元组总是排序的,而字典不是