You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免生成器返回重复值?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:53