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

如何用更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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:20:40