用于删除Python中重复项的迭代器对象

d'c*_*ang 2 python iterator object

嗨,所以我试图弄清楚如何使用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:
Run Code Online (Sandbox Code Playgroud)

我实际上并不完全确定在这个问题上接下来要做什么.在此先感谢任何意见或帮助!

the*_*eye 5

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

>>> def unique_values(iterable):
...     seen = set()
...     for item in iterable:
...         if item not in seen:
...             seen.add(item)
...             yield item
... 
Run Code Online (Sandbox Code Playgroud)

然后你可以创建一个独特值的元组,就像这样

>>> tuple(unique_values((1, 2, 3, 3, 4, 4, 5)))
(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

如果您确定数据将始终排序,那么您可以避免创建集合并仅跟踪以前的数据,如下所示

>>> 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)
Run Code Online (Sandbox Code Playgroud)

您可以使用类来编写迭代器对象

>>> 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
Run Code Online (Sandbox Code Playgroud)

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