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)
您可以编写自己的类来保留双端队列和集合:
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)