用于在Python中删除重复项的Iterator对象


问题内容

嗨,我想弄清楚如何使用Python创建一个迭代器对象,该对象将删除重复项或更多重复项,从而省略重复项。

例如,我有一个列表(1、2、3、3、4、4、5),而我得到了(1、2、3、4、5)

我知道为了获得迭代器对象,我必须创建它。所以:

Class Unique:
    def __init__(self, n):
         self.i = 0
         self.n = n

    def __iter__(self):
         return self

    def __next__(self):
        if self.i < self.n:

我实际上并不完全确定下一步该问题要做什么。在此先感谢您的任何意见或帮助!


问题答案:

更好地创建一个生成器函数,像这样

>>> def unique_values(iterable):
...     seen = set()
...     for item in iterable:
...         if item not in seen:
...             seen.add(item)
...             yield item
...

然后您可以创建一个唯一值的元组,像这样

>>> tuple(unique_values((1, 2, 3, 3, 4, 4, 5)))
(1, 2, 3, 4, 5)

如果您确定将始终对数据进行排序,则可以避免创建数据集并仅跟踪先前的数据,就像这样

>>> def unique_values(iterable):
...     it = iter(iterable)
...     previous = next(it)
...     yield previous
...     for item in it:
...         if item != previous:
...             previous = item
...             yield item
>>> tuple(unique_values((1, 2, 3, 3, 4, 4, 5)))
(1, 2, 3, 4, 5)

您可以像这样编写一个带有类的迭代器对象

>>> class Unique:
...     def __init__(self, iterable):
...         self.__it = iter(iterable)
...         self.__seen = set()
... 
...     def __iter__(self):
...         return self
... 
...     def __next__(self):
...         while True:
...             next_item = next(self.__it)
...             if next_item not in self.__seen:
...                 self.__seen.add(next_item)
...                 return next_item
... 
>>> for item in Unique((1, 2, 3, 3, 4, 4, 5)):
...     print(item)
... 
1
2
3
4
5

您可以参考此答案,以及Python
3数据模型文档中的
迭代器类型”部分。