如何在尺寸有限的结构中保留订购的独特物品?

Far*_*zin 5 python collections list set deque

我需要将元素流保存在大小有限的列表中。流中可能有重复的元素,但我需要保留唯一的元素。此外,当列表的大小超过指定限制时,我需要删除最旧的元素并添加新元素。

我已经尝试过set并且list. 问题set是它没有大小限制,如果我想删除最旧的元素,我不知道如何检索它,因为集合是无序的;然而,它解决了唯一性问题。

另一方面,list保持项目的顺序,但每当我想插入新元素时,我都需要检查可能的重复项,这可能会花费大量时间。也list不受尺寸限制set

我的第三个选择可能是,collections.deque但我不知道它是否保留订单。有什么办法可以保持物品的collections.deque独特性吗?

这些是我的代码示例list

ids = list()
for item in stream:
    if item not in ids:
        ids.append(item)
    if len(ids) >= len_limit:
        del ids[0]
Run Code Online (Sandbox Code Playgroud)

set

ids = set()
for item in stream:
    ids.add(item)
    if len(ids) >= len_limit:
        ids.remove(list(ids)[0])
Run Code Online (Sandbox Code Playgroud)

san*_*ash 2

您可以编写自己的类来保留双端队列和集合:

import collections


class Structure:
    def __init__(self, size):
        self.deque = collections.deque(maxlen=size)
        self.set = set()

    def append(self, value):
        if value not in self.set:
            if len(self.deque) == self.deque.maxlen:
                discard = self.deque.popleft()
                self.set.discard(discard)
            self.deque.append(value)
            self.set.add(value)

s = Structure(2)
s.append(1)
s.append(2)
s.append(3)
s.append(3)
print(s.deque)  # deque([2, 3], maxlen=2)
Run Code Online (Sandbox Code Playgroud)