Python生成器产出字典项报错及实现方法咨询
问题解答
报错原因
你遇到的generator is not subscriptable错误,是因为data()返回的是生成器对象,生成器是惰性迭代的容器,不能像字典、列表那样用下标['text']直接访问内部元素。
另外你的生成器代码存在隐患:变量l未提前初始化,所有yield的都是同一个字典对象,后续循环会覆盖之前的内容,必须每次循环创建新字典。
生成器是否要求产出同质?
生成器对产出内容没有强制同质性要求,可以混合输出不同类型的数据(比如字典、列表、字符串)。但在你的场景里,稳定产出包含text和label的字典,能让后续处理更规范高效。
正确实现方式
步骤1:修正生成器代码
先修复字典初始化问题,确保每次迭代产出独立的字典项:
pipe = pipeline(model=MODEL, config=MODEL, tokenizer=MODEL) def data(): for i in range(100): # 每次循环创建新字典,避免数据覆盖 item = { 'text': dataset['test'][i]['text'], 'label': dataset['test'][i]['label'] } yield item
步骤2:迭代生成器,处理文本并对比标签
生成器需要通过循环逐个取出字典项,再分别处理text和label:
方式1:逐条处理(适合需要逐次记录细节的场景)
for item in data(): # 提取文本传入模型预测 prediction = pipe(item['text']) # 提取模型预测的标签(以文本分类pipeline为例,返回结果含label字段) pred_label = prediction[0]['label'] # 对比原标签与预测标签 print(f"原标签: {item['label']}, 预测标签: {pred_label}, 匹配结果: {item['label'] == pred_label}")
方式2:批量处理(效率更高,适合支持批量输入的pipeline)
如果你的pipeline支持批量文本输入,可以先收集所有文本和标签,再一次性预测:
# 批量收集文本与真实标签 texts = [] true_labels = [] for item in data(): texts.append(item['text']) true_labels.append(item['label']) # 批量执行预测 predictions = pipe(texts) # 逐个对比真实标签与预测结果 for true_label, pred in zip(true_labels, predictions): pred_label = pred['label'] print(f"原标签: {true_label}, 预测标签: {pred_label}, 匹配结果: {true_label == pred_label}")
补充说明
- 不同类型的pipeline返回格式有差异,比如文本分类pipeline返回的是包含
label和score的字典/字典列表,需根据实际返回结构调整提取逻辑。 - 生成器的核心优势是节省内存,无需一次性加载所有数据,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者feiww
相关产品推荐
相关产品推荐

