如何避免生成器返回重复值?Python生成器实时去重方案问询
解决方案:在生成器内部实时去重
当然可以实现边生成边去重的需求!我们只需要在生成器函数内部维护一个集合,用来记录已经输出过的ID,每次处理元素时先检查ID是否已存在,只有未出现过的ID才会被yield出去。
先说说你原函数里的小细节问题:
- 生成器中的
return id没有实际作用,因为生成器在遇到yield时会暂停执行,当走到return语句时会直接触发StopIteration异常,且返回的值无法通过常规迭代获取到,所以可以直接去掉这行。 - 变量名
id是Python的内置函数(用来获取对象的内存地址),建议换成item_id这类更具语义的名称,避免覆盖内置函数引发潜在问题。
修改后的代码如下:
def fun(content): seen = set() # 用来记录已经生成过的ID,查询/添加效率极高 for i in content: item_id = i.split('"')[0] if item_id not in seen: seen.add(item_id) yield item_id
代码逻辑说明:
seen = set():初始化一个空集合,集合的成员查询和添加操作都是O(1)时间复杂度,不会因为数据量增大明显拖慢效率。- 每次从内容中分割出
item_id后,先判断它是否在seen集合中:- 如果不存在,就把它加入集合,然后
yield出去; - 如果已经存在,直接跳过当前元素,不进行任何输出。
- 如果不存在,就把它加入集合,然后
示例测试:
假设你的content测试数据是这样的:
test_content = ['1001"user1', '1002"user2', '1001"user3', '1003"user4'] for id_val in fun(test_content): print(id_val)
输出结果会是:
1001 1002 1003
完美实现了边生成边去重的效果,不需要先把所有ID都生成出来再用set()二次处理。
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

