collections.deque:一旦找到物品,如何有效地将其删除?

时间:2020-10-25 22:22:12

标签: python linked-list

我们想在链接列表中找到一个项目,对该项目做些什么,然后将其删除。

from collections import deque

q = deque([(12, 'apples'), (32, 'oranges'), (42, 'pears'), (12, 'peaches')])
john_smith_id = 42

for customer in q:
    id, data = customer
    if id == john_smith_id:
        myfunction(data)  # do something with John Smith's data
        q.remove(customer)
        break

我的问题是关于q.remove(customer)行。理想情况下,应该是O(1),因为我们已经在链接列表中找到了客户,但是我担心它可能遍历整个链接列表。

正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

它正在遍历列表。

如果您想要具有这种功能的链表,请不要使用collections.dequecollections.deque是双端队列类型,而不是链表类型。它在后台使用了展开的链表,但不支持所有可能的链表功能。通过实现展开的方式,它甚至不能支持您想要的操作-implementation使用64个元素的块,并且不支持部分为空的中间块,因此,如果不将操作一直拖到列表的末端之一,就无法从中间删除元素。

对于您的数据结构而言,链表似乎并不是一个不错的选择。看起来更像是一份字典。