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

从TOML配置文件中对两层嵌套字典进行排序

问题描述

我计划创建一个定义待执行作业链的TOML配置文件,作业并非连续执行,中间可中断,因此需对作业进行分组以支持中断处理。示例TOML文件如下:

[jobid_3.2]
name='script_3.2'
type='sql'
[jobid_10.1]
name='whatever_works'
type='shell'
[jobid_1.1]
name='script_1.1'
type='shell'
[jobid_3.1]
name='foobar'
type='shell'
[jobid_2.1]
name='barbaz'
type='shell'
[jobid_2.2]
name='script_2.2'
type='sql'

读取该配置后遇到以下问题:

  • 读取后得到三层嵌套字典结构(jobid_xxx层、子层及包含name和type的字典层);
  • TOML会将表键中的数字识别为字符串,需对第一层嵌套字典的键进行类型转换以处理数字逻辑;
  • 需要按键中的数字而非字符串本身对第一层进行排序,且希望保留带描述性的jobid_xxx格式键而非纯数字键。
解决方案

以下以Python为例,给出具体处理步骤:

1. 简化嵌套结构

使用Python内置的tomllib(3.11+版本支持)读取配置后,直接提取第一层字典的键值对,即可去掉多余的嵌套层:

import tomllib

with open("jobs.toml", "rb") as f:
    raw_config = tomllib.load(f)

# 直接得到 {jobid: {name, type}} 的两层结构
jobs = raw_config.copy()

2. 解析键中数字并实现排序

针对每个jobid_xxx格式的键,提取其中的数字部分转换为数值类型,以此作为排序依据,同时保留原键:

def extract_job_num(job_id):
    # 提取jobid_后缀的数字字符串并转为浮点数
    num_str = job_id.split("_")[1]
    return float(num_str)

# 按数字大小排序,得到排序后的键值对列表
sorted_job_items = sorted(jobs.items(), key=lambda x: extract_job_num(x[0]))

# 转回字典(Python 3.7+字典默认保留插入顺序)
sorted_jobs = dict(sorted_job_items)

3. 验证效果

运行上述代码后,sorted_jobs的键顺序会是:
jobid_1.1 → jobid_2.1 → jobid_2.2 → jobid_3.1 → jobid_3.2 → jobid_10.1
完全符合数字排序逻辑,同时保留了原有的jobid_xxx格式键,结构也简化为两层字典。

扩展:按作业分组排序

如果需要按数字的整数部分分组(比如3.x为同一组),可以修改排序逻辑,先按分组整数排序,同组内再按小数部分排序:

def extract_group_num(job_id):
    num_str = job_id.split("_")[1]
    return float(num_str.split(".")[0])

# 先按分组整数排序,再按完整数字排序
sorted_by_group = sorted(jobs.items(), key=lambda x: (extract_group_num(x[0]), extract_job_num(x[0])))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:47:16