字典列表中的值显示为None

0 投票
1 回答
49 浏览
提问于 2025-04-13 19:26

我有一个元组的列表:

x = [('router_1', '0/1', '0/4', 'router_2'),
     ('router_1', '0/2', '0/4', 'router_3'),
     ('router_4', '0/1', '0/5', 'router_5'),
     ('router_4', '0/2', '0/5', 'router_6')]

我的目标是把数据整理成下面的样子:

dict = {"details": [
        {
            "router_1": {
                "connections": [
                    {
                        "side_a": {
                            "device": "router_1",
                            "interface": "0/47",
                        },
                        "side_b": {
                            "interface": "0/17",
                            "device": "router_2",

                        }
                    },
                    {
                        "side_a": {
                            "device": "router_1",
                            "interface": "0/48",
                        },
                        "side_b": {
                            "interface": "0/17",
                            "device": "router_3",
                        }
                    }
                ]
            }
        },
        {
            "router_4": {
                "connections": [
                    {
                        "side_a": {
                            "device": "router_4",
                            "interface": "0/47",
                        },
                        "side_b": {
                            "interface": "0/17",
                            "device": "router_5",
                        }
                    },
                    {
                        "side_a": {
                            "device": "router_4",
                            "interface": "0/48",
                        },
                        "side_b": {
                            "interface": "0/17",
                            "device": "router_6",
                        }
                    }
                ]
            }
        }
    ]
}

请注意:

  • 键名 router_1 是根据 "side_a" 下的设备名称创建的
  • 键名 router_4 也是根据 "side_a" 下的设备名称创建的

我尝试了以下方法:

import collections
data_dict = collections.defaultdict(list)

result = {}

for item in x:
 router_a, router_a_int, router_b_int, router_b = item
 result[side_a] = data_dict["connections"].append({"side_a": {
 "hostname": router_a,
 "interface": router_a_int},
 "side_b": {
 "interface": router_b_int,
 "hostname": router_b
 }})

但是,字典的值显示为 "None"。看起来每次添加数据时,值都变成了 None,我以为使用 collections.defaultdict(list) 应该能解决这个问题。

请问你能帮忙吗?

谢谢

1 个回答

0
    x = [('router_1', '0/1', '0/4', 'router_2'),
         ('router_1', '0/2', '0/4', 'router_3'),
         ('router_4', '0/1', '0/5', 'router_5'),
         ('router_4', '0/2', '0/5', 'router_6')]
    from copy import deepcopy
    
    mDict = dict()
    mDict['details'] = list()
    tmpDict = dict()
    for a, aI, b, bI in x:
        if a not in tmpDict and tmpDict: mDict['details'].append(deepcopy(tmpDict))
        if a not in tmpDict: 
            tmpDict = dict()
            tmpDict[a] = dict({'connections': list()})
        tmpDict[a]['connections'].append(dict({
                                          "side_a": {
                                             "device": a,
                                             "interface": aI,
                                          },
                                          "side_b": {
                                             "interface": bI,
                                              "device": b,
                                          }
                                          })
                                          )
    mDict['details'].append(deepcopy(tmpDict))

这段话的意思是,只有在x里的连接总是排好序的情况下,这个方法才有效。

撰写回答