簡體   English   中英

迭代二維列表以刪除第一個和最后一個元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM