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