You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:01:21