【问题标题】:Is a Python list guaranteed to have its elements stay in the order they are inserted in?Python 列表是否保证其元素按插入顺序保持不变?
【发布时间】:2012-12-04 00:09:26
【问题描述】:

如果我有以下 Python 代码

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

是否保证x 始终为[1,2,3],或者是否可以对中间元素进行其他排序?

【问题讨论】:

  • 根据定义,列表是项目的有序序列,可通过其索引访问。
  • 我不明白这是个问题

标签: python


【解决方案1】:

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

【讨论】:

  • 这是正确的答案,所以我不想再添加一个。他还可以使用 list.append 真正让他放心。 docs.python.org/2/tutorial/datastructures.html
  • 如果我从一个函数返回一个本地列表并在调用函数中使用它会怎样。那是 def fn_1(): lst = [] lst.append(1) lst.append(2) return lst 和 def fn_2(): print(fn_1()) 无论我使用 fn_1() 多少次或在哪里使用,订单是否总是相同的?
  • 是的,python 列表中元素的顺序是持久的。 ;)
【解决方案2】:

简而言之,是的,订单被保留了。长篇:

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

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

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

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

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

【讨论】:

  • 我在某处读到,由于 JSON 数组的规范没有指定数组保持顺序,因此不能保证数组操作保持顺序。不过,我找不到它的来源。而且 Array 的底层结构仍然是具有编号索引的对象的特例,所以这与您的说法并不矛盾,只是一个有趣的花絮,我想。
  • 我不同意set的解释。集合绝对不是“比现实生活更倾向于数学和理论目的”。相反,集合在任何需要包含不能重复项的集合时都非常有用,并提供了对现实生活用例建模有用的工具,例如差异和交集。
  • @Pintun 在写完这篇文章几年后回首往事,我同意你的看法。一旦我想出一种更好的方式来表达我的目标,我就会进行编辑。
【解决方案3】:

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

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

mySet = {a, b, c, c}

不保证顺序,但 list 可以:

myList = [a, b, c]

【讨论】:

  • 请注意,集合 also 保证不重复。一个列表可能有重复的元素,而一个集合可能没有。
  • 字典也使用大括号。
  • 字典的查找键是一个“集合”,不能有重复。因此,对于集合和字典来说,使用花括号确实很有意义。
  • 或者...一个集合是一个字典,键后面没有有效负载/数据结构。同样,它们非常相似
【解决方案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。要查看差异,请在向x 添加任何内容之前尝试设置y = x 并尝试每一个,并查看两者对y 的差异。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      aList=[1,2,3]

      我=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]
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • Python 3 除外:D
        猜你喜欢
        • 1970-01-01
        • 2010-11-23
        • 2011-02-08
        • 2010-11-05
        • 2011-12-18
        • 2014-10-25
        • 2013-03-21
        • 2011-05-24
        相关资源
        最近更新 更多