如何从生成器函数映射两个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
相关产品推荐
相关产品推荐

