Python构造路由器连接字典时值为None问题求助
路由器连接字典构造问题排查
原始数据与需求
你的元组列表:
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')]
需求:生成以router_1、router_4等设备名为键的字典,每个键对应该设备的所有连接信息。
你的问题代码
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。
错误原因分析
list.append()返回None:这是核心问题。append()方法仅修改列表本身,不会返回有效内容(固定返回None),你把result[side_a]赋值为这个返回值,自然得到None。- 未定义
side_a变量:代码中直接使用side_a作为字典键,但这个变量从未被赋值,应该用router_a(也就是你要作为键的设备名称)。 defaultdict使用逻辑混乱:你创建了data_dict但未正确利用,反而额外维护result字典,导致逻辑冗余且出错。
修正后的代码
方案1:使用普通字典手动初始化
result = {} for router_a, router_a_int, router_b_int, router_b in x: # 构造单条连接的结构化数据 connection = { "side_a": {"hostname": router_a, "interface": router_a_int}, "side_b": {"hostname": router_b, "interface": router_b_int} } # 若设备名不在字典中,先初始化空列表 if router_a not in result: result[router_a] = [] # 将连接数据追加到对应列表 result[router_a].append(connection)
方案2:用defaultdict简化初始化(推荐)
from collections import defaultdict result = defaultdict(list) for router_a, router_a_int, router_b_int, router_b in x: connection = { "side_a": {"hostname": router_a, "interface": router_a_int}, "side_b": {"hostname": router_b, "interface": router_b_int} } # defaultdict会自动为不存在的键创建空列表,直接追加即可 result[router_a].append(connection) # 可选:将defaultdict转为普通字典 # result = dict(result)
运行结果
执行后result的内容:
{ 'router_1': [ {'side_a': {'hostname': 'router_1', 'interface': '0/1'}, 'side_b': {'hostname': 'router_2', 'interface': '0/4'}}, {'side_a': {'hostname': 'router_1', 'interface': '0/2'}, 'side_b': {'hostname': 'router_3', 'interface': '0/4'}} ], 'router_4': [ {'side_a': {'hostname': 'router_4', 'interface': '0/1'}, 'side_b': {'hostname': 'router_5', 'interface': '0/5'}}, {'side_a': {'hostname': 'router_4', 'interface': '0/2'}, 'side_b': {'hostname': 'router_6', 'interface': '0/5'}} ] }
内容的提问来源于stack exchange,提问作者karim gamil
相关产品推荐
相关产品推荐

