如何基于端口名(嵌套字典的第二个元素)对嵌套字典排序?
问题描述
我有一个包含超1000条记录的嵌套字典,结构如下:
{"Device1": [["Device1", "TenGigabitEthernet1/0/12", "SHUT", "", "", "IDF03"], ["Device1", "TenGigabitEthernet1/0/11", "SHUT", "", "", "IDF03", "#f76f6f"]], "Device2": [["Device2", "TenGigabitEthernet1/0/12", "SHUT", "", "", "IDF03"], ["Device2", "TenGigabitEthernet1/0/11", "SHUT", "", "", "IDF03", "#f76f6f"]]}
需求是基于端口名(即列表中的第二个元素,格式如TenGigabitEthernet1/0/*或GigabitEthernet1/0/*)对该嵌套字典进行排序。我尝试了以下代码,但仅对Device1、Device2这类键进行了排序,未实现需求:
with open("data-dic.txt", 'r') as dic: data = dic.read() dataDic = json.loads(data) dataDic = ast.literal_eval(json.dumps(dataDic)) d2 = OrderedDict({ k : dataDic[1] for k in natsorted(dataDic) }) print(d2)
解决方案
你的代码只对字典的设备名称键做了排序,没有处理每个设备下的端口列表。要实现按端口名排序,需要对每个设备对应的端口列表单独排序,结合自然排序(natsorted)来正确处理端口号的数字顺序。
修正后的代码
import json from natsort import natsorted with open("data-dic.txt", 'r') as dic: data = dic.read() data_dic = json.loads(data) sorted_data = {} # 可选:先对设备名排序,不需要可直接遍历data_dic.items() for device in natsorted(data_dic.keys()): ports = data_dic[device] # 按端口名(列表第二个元素)自然排序 sorted_ports = natsorted(ports, key=lambda x: x[1]) sorted_data[device] = sorted_ports print(sorted_data)
代码说明
- 解析数据:用
json.loads直接解析文件内容即可,无需额外使用ast.literal_eval(这一步是冗余操作)。 - 端口排序:使用
natsorted对每个设备下的端口列表排序,通过key=lambda x: x[1]指定以端口名(子列表的第二个元素)作为排序依据,自然排序能正确处理端口号的数字逻辑(比如TenGigabitEthernet1/0/11会排在TenGigabitEthernet1/0/12前面,避免字符串排序导致的顺序错误)。 - 设备名排序(可选):外层的
natsorted(data_dic.keys())用来对设备名称进行排序,如果不需要设备名有序,直接遍历data_dic.items()即可:sorted_data = {} for device, ports in data_dic.items(): sorted_ports = natsorted(ports, key=lambda x: x[1]) sorted_data[device] = sorted_ports - 兼容性:Python3.7及以上版本的普通字典会保留插入顺序,若需兼容更低版本,可替换为
OrderedDict。
内容的提问来源于stack exchange,提问作者user15109593
相关产品推荐
相关产品推荐

