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

如何基于端口名(嵌套字典的第二个元素)对嵌套字典排序?

问题描述

我有一个包含超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)

代码说明

  1. 解析数据:用json.loads直接解析文件内容即可,无需额外使用ast.literal_eval(这一步是冗余操作)。
  2. 端口排序:使用natsorted对每个设备下的端口列表排序,通过key=lambda x: x[1]指定以端口名(子列表的第二个元素)作为排序依据,自然排序能正确处理端口号的数字逻辑(比如TenGigabitEthernet1/0/11会排在TenGigabitEthernet1/0/12前面,避免字符串排序导致的顺序错误)。
  3. 设备名排序(可选):外层的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
    
  4. 兼容性:Python3.7及以上版本的普通字典会保留插入顺序,若需兼容更低版本,可替换为OrderedDict。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:30:55