Python:如何将字典中的列表值替换为含name键字典的列表?
Python字典列表值转换为字典列表
需求说明
需要将字典中值为列表类型的元素,转换为每个元素都是以'name'为键、原列表元素为值的字典,再用这个新列表替换原字典中的对应值。
原字典示例
Dic = { 'name': 'P1', 'srcintf': 'IntA', 'dstintf': 'IntB', 'srcaddr': 'IP1', 'dstaddr': ['IP2', 'IP3', 'IP4'], 'service': ['P_9100', 'SNMP'], 'schedule' : 'always', }
预期输出
Dic = { 'name': 'P1', 'srcintf': 'IntA', 'dstintf': 'IntB', 'srcaddr': 'IP1', 'dstaddr': [ {'name': 'IP2'}, {'name': 'IP3'}, {'name': 'IP4'} ], 'service': [ {'name': 'P_9100'}, {'name': 'SNMP'} ], 'schedule' : 'always', }
原代码问题分析
你尝试的代码存在几个关键问题:
liste变量未初始化,且每次处理列表值时没有重置,会导致不同键的结果被累积到同一个列表里NewDic被赋值为列表[k,v],而非构建目标字典结构- 仅打印了非列表值的键值对列表,没有正确生成完整的目标字典
原代码:
for k,v in Dic.items(): if not isinstance(v, list): NewDic = [k,v] print(NewDic) else: values = v keys = ["name"]*len(values) for item in range(len(values)): key = keys[item] value = values[item] SmallDic = {key : value} liste.append(SmallDic) NewDic = [k,liste]
正确解法
方法1:直接修改原字典
遍历字典的键值对,判断值是否为列表,若是则生成新的字典列表替换原值:
Dic = { 'name': 'P1', 'srcintf': 'IntA', 'dstintf': 'IntB', 'srcaddr': 'IP1', 'dstaddr': ['IP2', 'IP3', 'IP4'], 'service': ['P_9100', 'SNMP'], 'schedule' : 'always', } for key, value in Dic.items(): if isinstance(value, list): # 用列表推导式生成新的字典列表 Dic[key] = [{'name': item} for item in value] print(Dic)
方法2:创建新字典(不修改原字典)
如果不想改动原字典,可以创建一个新字典来存储结果:
original_dic = { 'name': 'P1', 'srcintf': 'IntA', 'dstintf': 'IntB', 'srcaddr': 'IP1', 'dstaddr': ['IP2', 'IP3', 'IP4'], 'service': ['P_9100', 'SNMP'], 'schedule' : 'always', } new_dic = {} for key, value in original_dic.items(): if isinstance(value, list): new_dic[key] = [{'name': item} for item in value] else: new_dic[key] = value print(new_dic)
这两种方法都能得到你想要的预期输出,其中列表推导式是Python中处理这类转换最简洁高效的方式。
内容的提问来源于stack exchange,提问作者Sthefania Moreno Reina
相关产品推荐
相关产品推荐

