从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
相关产品推荐
相关产品推荐

