用于在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数据模型文档中的
“迭代器类型”部分。