遍历2D列表以删除第一个和最后一个元素

时间:2020-05-20 06:58:57

标签: python

我有两个清单:

   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:“元组”对象没有属性“ pop”

预期结果:

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

3 个答案:

答案 0 :(得分:5)

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

a.pop(0)
a.pop()

b.pop(0)
b.pop()

甚至更好,切片。

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

答案 1 :(得分:4)

您真的想在这里切片:

>>> 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 :(得分:2)

您无需在列表上“ iterate” 即可删除第一个和最后一个元素。您可以根据具体使用情况使用切片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)]
>>>
相关问题