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

标签 python object 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

可以引用this answer , 和 Iterator Types section in Python 3 Data Model documentation

关于python - 用于在 Python 中删除重复项的迭代器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012878/

相关文章:

java - 如何在 Jackson Mapper 的帮助下使用单个 JSON 文件创建多种类型的 Java 对象?

数组中的 Javascript 对象引用

object - ColdFusion ORM : Table/View does not exist

c# - 为什么不能将迭代器 block 与 IOrderedEnumerable 一起使用

python - 使用迭代器实现 Chop()

python - 为什么我的文件没有打开?

python - 捻?在 python 中迭代时从列表中删除项目

python - wxPython:sizers,网格让我发疯

python - 具有可变成员的列表列表的产品

C++ 删除循环问题中的 std::list 元素