如何从嵌套字典中获取指定键的最大值及其对应主字典键?
如何从嵌套字典中找出指定键的最大值及其所属主键?
嘿,我明白你的需求了——你需要从这个嵌套字典里,提取每个主键(比如LUNAEUR、THETAEUR)下"1h"子字典里的"p"值,然后找出最大的那个值,同时拿到对应的主键。下面给你两种实用的解决思路,不管用不用Pandas都能搞定:
方法一:纯Python原生实现(无需额外库)
这种方法适合小数据量,代码简洁直接,不需要依赖第三方库:
data = { "LUNAEUR": { "1h": { "ot": "2021-07-09 08:00:00", "o": 6.033, "h": 6.551, "l": 5.983, "ct": "2021-07-09 08:59:59.999000", "p": -1.660459342023591 }, "stream0": { "c": 6.444, "v": 1393.808, "ct": "2021-07-09 09:59:59.999000" }, "stream1": { "c": 6.446, "v": 1171.177, "ct": "2021-07-09 09:59:59.999000" } }, "THETAEUR": { "1h": { "ot": "2021-07-09 08:00:00", "o": 4.992, "h": 5.076, "l": 4.956, "ct": "2021-07-09 08:59:59.999000", "p": -0.2963841138114934 }, "stream0": { "c": 5.061, "v": 492.138, "ct": "2021-07-09 09:59:59.999000" }, "stream1": { "c": 5.067, "v": 423.079, "ct": "2021-07-09 09:59:59.999000" } }, "GRTEUR": { "1h": { "ot": "2021-07-09 08:00:00", "o": 0.5616, "h": 0.5717, "l": 0.5523, "ct": "2021-07-09 08:59:59.999000", "p": -0.1752234098475558 }, "stream0": { "c": 0.5707, "v": 105.17, "ct": "2021-07-09 09:59:59.999000" }, "stream1": { "c": 0.571, "v": 19.71, "ct": "2021-07-09 09:59:59.999000" } } } # 先把每个主键和对应的p值打包成元组列表 p_items = [(key, data[key]["1h"]["p"]) for key in data] # 用max函数,指定按元组的第二个元素(p值)比较,找到最大值对应的项 max_item = max(p_items, key=lambda x: x[1]) print(f"最大p值对应的主键: {max_item[0]},数值: {max_item[1]}")
运行这段代码后,就会输出你想要的结果:最大p值对应的主键: GRTEUR,数值: -0.1752234098475558。
如果担心字典里可能存在某个主键没有"1h"或者"p"键的情况,可以加个判断避免报错:
p_items = [] for key in data: # 先检查必要的键是否存在 if "1h" in data[key] and "p" in data[key]["1h"]: p_items.append((key, data[key]["1h"]["p"])) if p_items: max_item = max(p_items, key=lambda x: x[1]) print(f"最大p值对应的主键: {max_item[0]},数值: {max_item[1]}") else: print("没有找到有效的p值")
方法二:用Pandas实现(适合大数据量/后续数据处理)
如果你习惯用Pandas,或者之后还要对数据做更多分析,可以把嵌套字典转换成DataFrame来处理:
import pandas as pd # 将嵌套字典转为DataFrame,orient='index'让主键成为行索引 df = pd.DataFrame.from_dict(data, orient='index') # 从"1h"列的每个字典中提取"p"值,生成一个Series p_series = df["1h"].apply(lambda x: x["p"]) # 获取最大值对应的主键(索引)和数值 max_key = p_series.idxmax() max_value = p_series.max() print(f"最大p值对应的主键: {max_key},数值: {max_value}")
这段代码的逻辑是:先把主键作为行索引,每个子字典的键作为列;然后用apply从"1h"列的每个字典里提取"p"值,得到一个以主键为索引的Series;最后用idxmax()拿到最大值对应的主键,max()拿到数值,结果和原生方法完全一致。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

