【问题标题】:iterate over 2D list to remove first and last element迭代二维列表以删除第一个和最后一个元素
【发布时间】:2020-09-06 10:54:14
【问题描述】:

我有两个设置列表:

   a = [(1,2),(3,4),(5,6),(7,8)]
   b = [(1,5),(7,7),(2,9),(0,3)]

我想删除每个列表的第一个和最后一个元素。这就是我所做的:

for idx, f in enumerate(a):
    print(f[idx].pop(0))
    print(f[idx].pop())
for idx, g in enumerate(b):
    print(g[idx].pop(0))
    print(g[idx].pop())

出现以下错误:

AttributeError: 'tuple' 对象没有属性 'pop'

预期结果:

   a = [(3,4),(5,6)]
   b = [(7,7),(2,9)]

【问题讨论】:

  • 为什么不直接切片呢?
  • 但是为什么如果我写这个a[1].pop(),它会起作用?当我迭代时,我收到错误@MD.KhairulBasar
  • 确实,'tuple' 对象没有属性'pop',但是元组确实实现了these methods
  • 为什么需要一个循环来弹出 2 个特定元素?
  • 我实际上有多个列表。它比给出的这个例子更复杂。需要循环

标签: python


【解决方案1】:

你真的很想在这里切片:

>>> a = [(1,2),(3,4),(5,6),(7,8)]
>>> b = [(1,5),(7,7),(2,9),(0,3)]
>>> a[1:-1]
[(3, 4), (5, 6)]
>>> b[1:-1]
[(7, 7), (2, 9)]

如果您需要定期从两端弹出项目,请考虑改用collections.deque

>>> from collections import deque
>>> a = [(1,2),(3,4),(5,6),(7,8)]
>>> b = [(1,5),(7,7),(2,9),(0,3)]
>>> a, b = deque(a), deque(b)
>>> a.popleft()
(1, 2)
>>> a.pop()
(7, 8)
>>> a
deque([(3, 4), (5, 6)])
>>> b.popleft()
(1, 5)
>>> b.pop()
(0, 3)
>>> b
deque([(7, 7), (2, 9)])

list.pop(0)O(N) 运算,而 collections.deque.popleft()O(1) 运算。

它甚至在https://wiki.python.org/moin/TimeComplexity 中推荐这个:

在内部,列表表示为数组;最大的成本来自超出当前分配大小的增长(因为所有内容都必须移动),或者来自在开始附近的某处插入或删除(因为之后的所有内容都必须移动)。如果您需要在两端添加/删除,请考虑改用 collections.deque。

【讨论】:

    【解决方案2】:

    您不需要在列表上“迭代” 来删除第一个和最后一个元素。可以使用切片,pop()remove(),具体看具体用例。

    以下是切片。如果a 是一个列表,a[1:-1] 返回一个列表,其中第一个和最后一个元素已被删除。

    Python 2.7.17 (v2.7.17:c2f86d86e6, Oct 19 2019, 21:01:17) [MSC v.1500 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = [(1,2),(3,4),(5,6),(7,8)]
    >>> b = [(1,5),(7,7),(2,9),(0,3)]
    >>> a = a[1:-1]
    >>> b = b[1:-1]
    >>> a
    [(3, 4), (5, 6)]
    >>> b
    [(7, 7), (2, 9)]
    >>>
    

    【讨论】:

      【解决方案3】:

      您正试图从元组中删除第一项。但是,您希望删除元组。此处不需要索引,只需从列表中删除第一个和最后一个元组即可。

      a.pop(0)
      a.pop()
      
      b.pop(0)
      b.pop()
      

      或者更好的是,切片。

      a = a[1:-1]
      b = b[1:-1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多