【问题标题】:How do I remove the first item from a list?如何从列表中删除第一个项目?
【发布时间】:2011-05-24 12:33:09
【问题描述】:

我有列表[0, 1, 2, 3, 4],我想将其添加到[1, 2, 3, 4]。我该怎么做?

【问题讨论】:

    标签: python arrays list


    【解决方案1】:

    您可以找到一些有用的列表函数here

    list.pop(index)

    >>> l = ['a', 'b', 'c', 'd']
    >>> l.pop(0)
    'a'
    >>> l
    ['b', 'c', 'd']
    >>> 
    

    del list[index]

    >>> l = ['a', 'b', 'c', 'd']
    >>> del l[0]
    >>> l
    ['b', 'c', 'd']
    >>> 
    

    这些都修改了您的原始列表。

    其他人建议使用切片:

    • 复制列表
    • 可以返回子集

    另外,如果你正在执行许多pop(0),你应该看看collections.deque

    from collections import deque
    >>> l = deque(['a', 'b', 'c', 'd'])
    >>> l.popleft()
    'a'
    >>> l
    deque(['b', 'c', 'd'])
    
    • 提供从列表左端弹出的更高性能

    【讨论】:

    • 你也可以使用负数索引,与列表的含义相同。
    • 就我而言,时间从 1:31 分钟开始下降。使用 pop(0) 到 200 - 250 ms,使用 deque。非常感谢。
    【解决方案2】:

    切片:

    x = [0,1,2,3,4]
    x = x[1:]
    

    这实际上会返回原始的子集,但不会修改它。

    【讨论】:

    • 如果x 是空的,x=x[1:] 将把它留空而不会抱怨。 x.pop(0) 会抛出一个空列表 x。有时抛出是人们想要的:如果列表中至少有一个元素的假设是错误的,那么人们可能希望得到通知。
    • 我更喜欢这个回复,因为突变几乎总是邪恶的。
    【解决方案3】:
    >>> x = [0, 1, 2, 3, 4]
    >>> x.pop(0)
    0
    

    更多关于here

    【讨论】:

      【解决方案4】:

      你会这样做

      l = [0, 1, 2, 3, 4]
      l.pop(0)
      

      l = l[1:]

      优点和缺点

      使用 pop 可以检索值

      x = l.pop(0) x 将是 0

      【讨论】:

        【解决方案5】:

        使用列表切片,请参阅有关lists 的 Python 教程了解更多详情:

        >>> l = [0, 1, 2, 3, 4]
        >>> l[1:]
        [1, 2, 3, 4]
        

        【讨论】:

          【解决方案6】:

          然后删除它:

          x = [0, 1, 2, 3, 4]
          del x[0]
          print x
          # [1, 2, 3, 4]
          

          【讨论】:

            【解决方案7】:

            您可以使用list.reverse() 反转列表,然后list.pop() 删除最后一个元素,例如:

            l = [0, 1, 2, 3, 4]
            l.reverse()
            print l
            [4, 3, 2, 1, 0]
            
            
            l.pop()
            0
            l.pop()
            1
            l.pop()
            2
            l.pop()
            3
            l.pop()
            4
            

            【讨论】:

            • 当你可以使用l.pop(0)时为什么会这么复杂?在使用l.pop() 后,您忘记了l.reverse()。您的解决方案性能不佳
            【解决方案8】:

            您还可以使用list.remove(a[0])pop 列出列表中的第一个元素。

            >>>> a=[1,2,3,4,5]
            >>>> a.remove(a[0])
            >>>> print a
            >>>> [2,3,4,5]
            

            【讨论】:

            • OP 并没有询问最好的方法。这只是实现相同目标的另一种方法!
            • 是的,另一种方法与其他答案相比没有优势。有很多方法可以做到这一点。为什么不回答a.remove(a[1-1])?那是另一种方式。
            • 我的意思是,你的答案比其他答案更糟糕,没有什么可推荐的。没有理由将这个答案用于其他答案。仅仅因为它是“另一种方式”并不是在此处添加它的理由。
            • @NedBatchelder 你的观点没有实际意义。这是 Python 中列表可用的一种额外方法,特定于此特定任务,为了完整起见,应该注意它。另一方面,人为的 BS a[1-1] 示例并非如此。更不用说他的答案在任何方面都不“比其他答案差”。
            • 我坚持我的问​​题:这看起来很奇怪和做作,没有什么可推荐的。事实上,第一句话是有误导性的,因为你不能用list.remove(a[i]) 删除第i 个元素。对于重复值,它可能会找到具有相同值的较早元素,并删除该元素而不是第 i 个。
            【解决方案9】:

            如果您使用的是numpy,则需要使用delete 方法:

            import numpy as np
            
            a = np.array([1, 2, 3, 4, 5])
            
            a = np.delete(a, 0)
            
            print(a) # [2 3 4 5]
            

            【讨论】:

              【解决方案10】:

              有一种称为deque 或双端队列的数据结构,它比列表更快、更高效。您可以使用您的列表并将其转换为双端队列并在其中进行所需的转换。您还可以将双端队列转换回列表。

              import collections
              mylist = [0, 1, 2, 3, 4]
              
              #make a deque from your list
              de = collections.deque(mylist)
              
              #you can remove from a deque from either left side or right side
              de.popleft()
              print(de)
              
              #you can covert the deque back to list
              mylist = list(de)
              print(mylist)
              

              Deque 还提供了非常有用的功能,例如将元素插入列表的任一侧或任何特定的索引。您还可以旋转或反转双端队列。试试看!

              【讨论】:

              • 它只是在某些情况下效率更高,而不是全面。它与列表有不同的权衡,以及为什么两者都存在。
              【解决方案11】:

              拆包作业:

              您可以使用PEP 3132 中提到的解包分配。

              解决办法:

              您应该尝试如下解包:

              >>> l = [0, 1, 2, 3, 4]
              >>> _, *l = l
              >>> l
              [1, 2, 3, 4]
              

              解释:

              PEP 3132中所述:

              此 PEP 提议对可迭代解包语法进行更改,允许 指定一个“包罗万象”的名称,该名称将被分配所有项目的列表 未分配给“常规”名称。

              一个例子说一千多个单词:

              >>> a, *b, c = range(5)
              >>> a
              0
              >>> c
              4
              >>> b
              [1, 2, 3]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-10-26
                • 1970-01-01
                • 2015-04-02
                • 2011-02-14
                • 1970-01-01
                • 1970-01-01
                • 2018-09-14
                • 1970-01-01
                相关资源
                最近更新 更多