我有两个清单:
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)]
答案 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)]
>>>