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

如何从生成器函数映射两个yield返回的变量?附代码示例

如何从生成器映射yield返回的变量到字典?

嘿,我看你已经写了一个生成器函数filee,用来从SNMP日志文件里提取时间戳和CPU负载值,每次yield一个(timestamp, load)元组,现在想要把这些成对的数据转换成字典对吧?其实这个需求实现起来非常直接,因为你的生成器输出正好是字典需要的键值对结构。

两种简单的实现方式

你的生成器每次产出的是包含键(timestamp)和值(load)的元组,所以我们可以直接用下面两种方式转换:

1. 字典推导式

这是最直观的写法,遍历生成器的每个元组,把第一个元素作为字典的键,第二个作为对应的值:

listyield = filee("snmpfile.txt")
mappedload = {timestamp: load for timestamp, load in listyield}

2. 直接使用dict()构造函数

Python的dict()可以接收任何产生键值对元组的可迭代对象,生成器正好符合这个要求,所以写法更简洁:

mappedload = dict(filee("snmpfile.txt"))

完整优化后的代码示例

另外,我给你的生成器做了一点小优化——用with语句管理文件,这样不用手动关闭文件,避免资源泄漏:

def filee(filename):
    cpu = "iso.3.6.1.4.1.2021.10.1.3.1 = STRING:"
    # 使用with语句自动管理文件生命周期
    with open(filename) as file:
        lineno = 0
        timestamp = None
        for line in file:
            lineno += 1
            # 提取时间戳部分
            linestriptime = line[line.find("(")+1:line.find(")")]
            # 提取负载值部分
            linestripload = line.strip(cpu + '\n').replace('"', '')
            
            if lineno % 2 == 0:
                load = float(linestripload)
                yield (timestamp, load)
            else:
                timestamp = int(linestriptime)

# 转换为字典
mapped_load = dict(filee("snmpfile.txt"))

# 验证结果
for ts, load_val in mapped_load.items():
    print(f"时间戳: {ts}, CPU负载: {load_val}")

注意事项

如果你的日志文件里存在重复的时间戳,字典里后面的负载值会覆盖前面的,因为字典的键必须是唯一的。如果需要保留所有对应记录,可以把字典的值改成列表,比如:

from collections import defaultdict

mapped_load = defaultdict(list)
for ts, load_val in filee("snmpfile.txt"):
    mapped_load[ts].append(load_val)

这样同一个时间戳的所有负载值都会被存在对应的列表里。

内容的提问来源于stack exchange,提问作者CorvusRex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:06:43