2021-09-08 19:05:48
在Python3中,将列表中多个字符串字典合并为一个字典,需先将字符串转换为字典对象,再通过update()方法合并。以下是具体实现及注意事项:
核心步骤字符串转字典使用json.loads()将符合JSON格式的字符串转为字典。若字符串为Python字典格式(如单引号),需先替换为双引号或使用ast.literal_eval()。
合并字典通过dict.update()逐个合并字典,或使用字典解包(Python 3.5+)简化操作。
若字符串使用单引号(非JSON标准),可用ast.literal_eval()安全解析:
import astl1 = [ "{'xvda': {'I/O': {'r/s': '0.33', 'await': '12.58', 'w/s': '0.46'}, 'use_%': '32', 'total_G': '15G'}}", "{'xvdf': {'I/O': {'r/s': '0.00', 'await': '20.23', 'w/s': '0.01'}, 'use_%': '2', 'total_G': '100G'}}"]result = {}for s in l1: # 替换单引号为双引号(可选,若字符串格式混乱) s = s.replace("'", '"') result.update(ast.literal_eval(s))print(result)方法3:字典解包(Python 3.5+)更简洁的合并方式:
import jsonl1 = [ '{"xvda": {"I/O": {"r/s": "0.33"}}}', '{"xvdf": {"I/O": {"r/s": "0.00"}}}']# 使用字典解包合并result = {k: v for d in map(json.loads, l1) for k, v in d.items()}print(result)关键注意事项字符串格式
JSON要求双引号,若原字符串为单引号,需替换或使用ast.literal_eval()。
避免直接eval(),存在安全风险。
键冲突处理update()会覆盖重复键的值。若需保留所有值,可改为合并嵌套字典:
from collections import ChainMapresult = dict(ChainMap(*map(json.loads, l1)))性能优化对于大规模数据,建议使用生成器表达式减少内存占用:
result = {}for d in (json.loads(s) for s in l1): result.update(d)合并后的字典结构:
{ "xvda": {"I/O": {"r/s": "0.33", "await": "12.58", "w/s": "0.46"}, "use_%": "32", "total_G": "15G"}, "xvdf": {"I/O": {"r/s": "0.00", "await": "20.23", "w/s": "0.01"}, "use_%": "2", "total_G": "100G"}}通过上述方法,可灵活处理不同格式的字符串字典并高效合并。