【问题标题】:How to use list slicing to append to end of list in python?python - 如何使用列表切片附加到python中的列表末尾?
【发布时间】:2017-11-30 06:09:21
【问题描述】:

Following 可用于添加切片以追加到列表的前面。

>>> a = [5,6]
>>> a[0:0] = [1,2,3]
>>> a
[1,2,3,5,6]

用来追加到列表末尾的切片。

【问题讨论】:

标签: python list slice


【解决方案1】:

如果真的要使用slice,可以使用a的长度:

a = [5, 6]
a[len(a):] = [1, 2, 3]
a

输出:

[5, 6, 1, 2, 3]

不过最简单的还是直接扩展a

a = [5, 6]
a += [1, 2, 3]   # or a.extend([1, 2, 3])

【讨论】:

  • 但是切片方法不是比+=更快吗
  • @PiyushDivyanakar:+= 基本上保证更快(切片操作涉及临时的list 对象,以及非常昂贵的len 调用)。 += 更具可读性,并且是可用的最快选项。
  • @ShadowRanger:虽然如果它是一个非局部变量extend() 可能会更好。 stackoverflow.com/a/24261311/499581
  • @l'L'l: 没错,虽然在 Py3 上,您可以显式声明变量 nonlocal+= 将起作用。它仍然无法工作的情况包括当有问题的listtuple 的一部分时; mytuple = ([], []); mytuple[0] += [1,2,3] 是一个错误,而调用 extend 很好(因为它不会尝试重新分配 mytuple[0])。
【解决方案2】:

我觉得你应该考虑extend():

>>> a = [1, 2, 3]
>>> a.extend([4, 5, 6])
>>> a
[1, 2, 3, 4, 5, 6]

++= 运算符都是为列表定义的,它们在语义上是 类似于扩展。

list + list2 在内存中创建第三个列表,因此您可以返回 它的结果,但它要求第二个迭代是一个列表。

list += list2 就地修改列表(就是就地操作符, 和列表是可变对象,正如我们已经看到的)所以它不会创建一个 新名单。它也像扩展一样工作,因为第二个可迭代可以 可以是任何类型的可迭代对象。

时间复杂度

  • Append 具有恒定的时间复杂度,O(1)
  • Extend 具有时间复杂度,O(k)

遍历多次调用 append 增加了复杂性, 使其等同于扩展,并且由于扩展的迭代 是用 C 实现的,如果你打算追加它总是会更快 从一个可迭代的连续项目到一个列表。

More Information

【讨论】:

    【解决方案3】:
    >>> a = [1, 2, 3]
    >>> a[len(a):] = [4, 5, 6]
    >>> a
    [1, 2, 3, 4, 5, 6]
    

    >>> a = [1, 2, 3]
    >>> a += [4, 5, 6]
    >>> a
    [1, 2, 3, 4, 5, 6]
    

    【讨论】:

      【解决方案4】:

      你从 Jeevaa 和 Reblochon Masque 那里得到了简短的回答,但如果你想使用 for 循环,那么试试这个:

      a = [5,6]
      b = [1,2,3]
      for val in b[::-1]:#Reverse b and insert it to a
         a.insert(0,val)
      print(a)
      

      输出

      [1,2,3,5,6]
      

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多