[英]iterate over 2D list to remove first and last element
我有兩個設置列表:
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' object 沒有屬性 'pop'
預期結果:
a = [(3,4),(5,6)]
b = [(7,7),(2,9)]
您正在嘗試從元組中刪除第一項。 但是,您希望刪除元組。 您在這里不需要索引,只需從列表中刪除第一個和最后一個元組。
a.pop(0)
a.pop()
b.pop(0)
b.pop()
或者更好的是,切片。
a = a[1:-1]
b = b[1:-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。
您無需在列表上“迭代”即可刪除第一個和最后一個元素。 您可以根據具體用例使用切片、 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)]
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.