【问题标题】:Why doesn't a.insert(-1, x) mimic a.append(x)?为什么 a.insert(-1, x) 不模仿 a.append(x)?
【发布时间】:2017-12-30 13:10:09
【问题描述】:

所以我有以下 Python 代码,它将数字 1-10 附加到列表 values

values = []

for value in range(1, 11):
    values.append(value)

print(values)

正如预期的那样,给我们[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

虽然不切实际,但出于好奇,我尝试使用 insert() 而不是 append() 重新创建此结果:

values = []

for value in range(1, 11):
    values.insert(-1, value)

print(values)

这给了我[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]的结果。

我也尝试过其他范围,每次都发生同样的事情:它是按升序排列的,除了最小的数字在末尾。

Python Documentation Tutorial,我现在知道a.insert(len(a), x)可以用来模仿a.append(x)。但是,我仍然不明白为什么将值插入到列表中的最后一个位置,除了最小值。

【问题讨论】:

  • 需要注意的一点是,插入函数在索引处插入值并递增所有值的索引(在索引之上和之后)。所以第一个插入将是 [1](现在 1 在索引 -1)接下来将是 [2,1](现在 1 在索引 -1)然后是 [2,3,1] 等等。

标签: python list insert append


【解决方案1】:

要了解的基本内容是-1len(a) 不同。确实和len(a) - 1一样:

In [396]: x = [1, 2, 3]

In [397]: x[-1]
Out[397]: 3

In [398]: x[len(x) - 1]
Out[398]: 3 

当列表的大小为 1 或更大时,len(a) - 1 将始终指向最后一个元素之前的位置(或者,从技术上讲,指向当前最后一个元素所在的位置),即list.insert将放置您的新项目。

In [400]: x.insert(-1, 4); x
Out[400]: [1, 2, 4, 3]

正如您已经发现的那样,len(a) 指向最后一个元素之后的位置,这是list.append 插入元素的位置。因此,-1len(a) - 1 将指向最后一个元素的位置,list.insert(-1, ...) 会将最后一个元素推到右侧,并将新元素放在最后一个元素的旧位置。

【讨论】:

    【解决方案2】:

    当您插入第一个项目(数字 1)时,它会插入到列表的确切末尾,因为列表中没有任何其他项目。一旦发生这种情况,其余的插入发生在列表的最后一项之前,因为 -1 是列表的最后一项,insert() 在指定索引之前插入。

    insert() 完全可以在一个空列表上工作,这让我感到有点惊讶。

    【讨论】:

      【解决方案3】:

      我认为这是因为insert 在指定位置之前 放入了元素。所以a.insert(-1, value) 所做的是,它将value 放在最后一个元素之前,因此成为倒数第二个。但是当列表为空时,没有这样的倒数第二个元素,它会将它放在最后一个索引中。

      >>> a=[]
      >>> a.insert(-1, 1)
      >>> a
      [1] #list is empty so it is inserted in the last index
      >>> a.insert(-1, 2)
      >>> a
      [2, 1] #It placed the 2 on the second to last position, right before the 1
      

      【讨论】:

        【解决方案4】:

        这是因为-1 匹配len(value)-1 或列表中最后一项的索引,因此如果您解压缩list.insert() 调用您的value 列表更改为:

        []  # insert(-1, 1) -> -1 translates to -1 (unclear state)
        [1]  # insert(-1, 2) -> -1 translates to 0
        [2, 1]  # insert(-1, 3) -> -1 translates to 1
        [2, 3, 1]  # insert(-1, 4) -> -1 translates to 2
        [2, 3, 4, 1]  # insert(-1, 5) -> -1 translates to 3
        [2, 3, 4, 5, 1]  # insert(-1, 6) -> -1 translates to 4
        [2, 3, 4, 5, 6, 1]  # insert(-1, 7) -> -1 translates to 5
        [2, 3, 4, 5, 6, 7, 1]  # insert(-1, 8) -> -1 translates to 6
        [2, 3, 4, 5, 6, 7, 8, 1]  # insert(-1, 9) -> -1 translates to 7
        [2, 3, 4, 5, 6, 7, 8, 9, 1]  # insert(-1, 10) -> -1 translates to 8
        [2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
        

        【讨论】:

          猜你喜欢
          • 2012-07-05
          • 1970-01-01
          • 2019-08-02
          • 2022-01-24
          • 2013-03-08
          • 2016-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多