Python中将嵌套列表转为含Decimal的字典报错解决方法
解决嵌套列表转字典及Decimal类型处理问题
错误原因分析
你写的循环多了不必要的一层:原数据a中的每个元素x本身就是[日期列表, Decimal数值]的结构,第二层for b in x会依次遍历到日期列表和Decimal对象。当遍历到Decimal对象时,尝试用b[1]访问下标,就会触发TypeError: 'decimal.Decimal' object is not subscriptable——因为Decimal不是序列类型,不支持下标访问。
正确实现代码
根据你的需求,这里分两种情况处理:
情况1:将原数据中的每个条目都转成字典,生成字典列表
from decimal import Decimal a = [ [[1, 8, 2022], Decimal("666.6666666666666666666666667")], [[8, 8, 2022], Decimal("10000")], ] data_list = [] for item in a: # 直接取每个条目里的日期和Decimal数值 date = item[0] # 处理Decimal:转成保留两位小数的数值,两种方法可选 # 方法1:转float后四舍五入(简单直观,适合大部分场景) kpi = round(float(item[1]), 2) # 方法2:用Decimal自身的quantize方法(更精确,避免浮点数精度问题) # from decimal import ROUND_HALF_UP # kpi = item[1].quantize(Decimal('0.00'), rounding=ROUND_HALF_UP) data_list.append({"date": date, "kpi": kpi}) print(data_list)
输出结果:
[{'date': [1, 8, 2022], 'kpi': 666.67}, {'date': [8, 8, 2022], 'kpi': 10000.0}]
情况2:只提取原数据中的第一个条目生成单个字典
from decimal import Decimal a = [ [[1, 8, 2022], Decimal("666.6666666666666666666666667")], [[8, 8, 2022], Decimal("10000")], ] item = a[0] data_dict = { "date": item[0], "kpi": round(float(item[1]), 2) } print(data_dict)
输出结果:
{'date': [1, 8, 2022], 'kpi': 666.67}
关于Decimal类型的补充说明
如果对数值精度要求很高(比如金融场景),推荐用quantize方法处理Decimal,它能避免浮点数的精度丢失问题。使用时需要导入ROUND_HALF_UP来指定四舍五入规则。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

