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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:15:27