如何将含键值对字符串的Python列表转换为字典?
解决方案:将格式异常的键值对列表转为Python字典
原列表中的字符串不符合标准JSON或Python字面量规范,导致json.loads()和ast.literal_eval()无法直接解析,问题点包括:
- 键的引号是HTML转义的
"而非普通双引号 - 列表值内的元素(如
loopback)未加引号,不属于合法字符串 {{ sensor_subnets }}是模板占位符,并非合法的Python/JSON语法
以下是可行的处理代码:
import re import ast d = ['"id.resp_h": [loopback, unicast, multicast, interface_local_multicast, link_local_unicast, link_local_multicast, unspecified]', '"id.orig_h": {{ sensor_subnets }}'] result_dict = {} for item in d: # 替换HTML转义引号为普通双引号 cleaned_item = item.replace('"', '"') # 按第一个冒号拆分键值对,避免值内有冒号导致错误 key_segment, value_segment = cleaned_item.split(':', 1) # 提取并清理键 key = key_segment.strip().strip('"') # 清理值部分的前后空白 raw_value = value_segment.strip() # 处理列表类型的值:给无引号元素添加引号后转为列表 if raw_value.startswith('[') and raw_value.endswith(']'): # 匹配列表内的标识符,为其添加双引号 formatted_value = re.sub(r'([a-zA-Z0-9_-]+)', r'"\1"', raw_value) # 用ast.literal_eval转为Python列表 processed_value = ast.literal_eval(formatted_value) # 处理模板占位符:可根据需求替换为实际值,此处先保留占位符名称 elif raw_value.startswith('{{') and raw_value.endswith('}}'): processed_value = raw_value.strip('{} ') # 若有实际变量,可替换为:processed_value = sensor_subnets(需提前定义变量) else: # 其他类型值可根据实际情况扩展处理逻辑 processed_value = raw_value result_dict[key] = processed_value print(result_dict)
代码关键点说明
- 用
replace('"', '"')修复转义引号问题 split(':', 1)确保只拆分键和值的分隔符,避免值内包含冒号时出错- 正则表达式
re.sub(...)自动为列表内的无引号标识符添加双引号,使其符合Python字面量格式 - 模板占位符的处理可灵活调整:如果有实际的
sensor_subnets变量,直接替换即可
内容的提问来源于stack exchange,提问作者Amit Vikram Raj
相关产品推荐
相关产品推荐

