如何自动生成指定范围、带前缀键值的嵌套Python字典
生成带嵌套子字典的Python字典问题解决
问题描述
需要自动生成包含嵌套子字典的Python字典,示例格式如下:
{'C1': {'inlet': 'J1'}, 'C2': {'inlet': 'J2'}, 'C3': {'inlet': 'J3'}}
要求通过定义数值范围,自动为顶层键添加C前缀,为子字典的inlet值添加J前缀。目前已实现C前缀键的生成,但无法正确填充对应的J前缀值,附上尝试代码及问题说明:
原尝试代码
#Define list of C1, C2, C3, ....... where it creates values up to a value defined by a range def c_values(list1, str1): str1 += '{0}' list1 = [str1.format(i) for i in list1] return(list1) str1 = 'C' list1 = range(1,4,1) result1 = c_values(list1,str1) print(result1) #Define list of J1, J2, J3, ....... where it creates values up to a value defined by a range def j_values(list2, str2): str2 += '{0}' list2 = [str2.format(i) for i in list2] return(list2) str2 = 'J' list2 = range(1,4,1) result2 = j_values(list2,str2) print(result2) #Combine result1 and result2 into a dictionary result3 = dict(zip(result1,result2)) print(result3) #Build final dictionary output = {} inputdata = 'J' for key,value in result3.items(): for i in result3: output[i] = {'inlet':inputdata} print(output)
错误原因
最后一段构建最终字典的代码存在两个核心问题:
- 嵌套循环
for i in result3完全多余,每次外层循环都会遍历所有键,重复赋值覆盖之前的结果 - 没有使用
result3中存储的value(即J1、J2、J3),而是固定用inputdata = 'J'作为inlet的值,导致所有子字典的inlet值都是'J'而非对应序号的Jx
修正方案
方案1:基于原代码修改
只需要修改最后构建字典的部分,去掉多余的嵌套循环,直接使用result3中的key和value:
#Build final dictionary output = {} for key, value in result3.items(): output[key] = {'inlet': value} print(output)
运行后即可得到预期输出:
{'C1': {'inlet': 'J1'}, 'C2': {'inlet': 'J2'}, 'C3': {'inlet': 'J3'}}
方案2:简化实现(推荐)
无需拆分多个函数和步骤,直接使用字典推导式一步生成目标字典,代码更简洁高效:
# 定义数值范围(左闭右开,这里1到4对应生成1、2、3) start = 1 end = 4 # 一步生成目标字典 output = {f'C{i}': {'inlet': f'J{i}'} for i in range(start, end)} print(output)
此方法直接通过循环数值范围,同时生成带C前缀的键和带J前缀的inlet值,避免了中间变量的冗余。
内容的提问来源于stack exchange,提问作者xshovelfighter
相关产品推荐
相关产品推荐

