如何用更Pythonic的方式计算嵌套字典中的最大时间值?
问题:计算嵌套字典中所有时间值的最大值
给定如下嵌套字典,需要计算其中所有时间值的最大值,字典中唯一固定的公共键是time,其余键为动态变化的站点名称:
time_values = { "A": { "time": { "B": 2, "C": 3, "D": 5 } }, "B": { "time": { "A": 7, "C": 2, "D": 3 } }, "C": { "time": { "A": 8, "B": 9, "D": 2 } }, "D": { "time": { "A": 7, "B": 2, "C": 3 } } }
初始实现代码如下:
max_time = 0 for station in time_values: for other_station in time_values[station]["time"]: if time_values[station]["time"][other_station] > max_time: max_time = time_values[station]["time"][other_station]
尝试的优化写法:
import itertools time_list = [] for _, b in time_values.items(): time_list.append(list(b.get("time").values())) max_value = max(list(itertools.chain(*time_list)))
以下是几种更Pythonic的优化思路:
方案1:嵌套生成器表达式(最简洁高效)
直接用生成器表达式遍历所有时间值,无需构建中间列表,内存开销更低:
max_time = max(val for station_data in time_values.values() for val in station_data["time"].values())
这种写法将两层循环逻辑压缩为一行,生成器会按需产出每个时间值,max()函数可直接迭代生成器,不用预先存储所有值,既简洁又节省内存。
方案2:结合itertools.chain.from_iterable
如果偏好使用itertools工具库,chain.from_iterable比chain(*time_list)更高效,避免了列表解包的额外操作:
import itertools time_iter = (station_data["time"].values() for station_data in time_values.values()) max_time = max(itertools.chain.from_iterable(time_iter))
这里用生成器表达式传入chain.from_iterable,全程只生成迭代器而非完整列表,内存占用进一步降低。
方案3:用map简化取值逻辑
可以结合map提取每个站点的时间值集合,再通过chain.from_iterable合并:
import itertools max_time = max(itertools.chain.from_iterable(map(lambda x: x["time"].values(), time_values.values())))
通过map批量处理每个站点的数据,提取时间值的迭代器,再合并后取最大值,代码逻辑清晰。
与你尝试写法的对比
你之前的代码需要先将所有时间值转为列表再合并,会额外占用内存存储完整的时间值列表。而上面的方案都采用迭代器/生成器的方式,仅在需要时产生值,内存效率更高,同时代码更符合Python简洁风格。
内容的提问来源于stack exchange,提问作者cicciodevoto
相关产品推荐
相关产品推荐

