如何对含列表、字典的嵌套数据结构递归取整小数?
递归处理嵌套数据结构中的小数取整
当然可以实现这种递归取整的方法,下面是适配Python 3.x的简洁实现,支持任意深度嵌套的列表、字典,同时兼容float和Decimal类型:
实现代码
from decimal import Decimal def round_nested_data(data, decimals=0): # 处理字典:递归处理每个值 if isinstance(data, dict): return {key: round_nested_data(value, decimals) for key, value in data.items()} # 处理列表:递归处理每个元素 elif isinstance(data, list): return [round_nested_data(item, decimals) for item in data] # 处理小数类型:执行取整 elif isinstance(data, (float, Decimal)): return round(data, decimals) # 其他类型直接返回 else: return data
使用示例
测试嵌套数据:
test_data = { "pi": 3.1415926, "measurements": [1.618, 2.718, {"inner_value": 0.5772}], "financials": {"tax_rate": Decimal("0.0825"), "amounts": [100.45, 200.78]} } # 保留两位小数取整 result = round_nested_data(test_data, decimals=2) print(result)
输出结果:
{ "pi": 3.14, "measurements": [1.62, 2.72, {"inner_value": 0.58}], "financials": {"tax_rate": Decimal('0.08'), "amounts": [100.45, 200.78]} }
对比旧方案的优势
你提到的旧方案多基于Python 2语法(比如使用dict.iteritems()),且大多只处理float类型,没有考虑Decimal这类高精度小数类型。上面的实现:
- 采用Python 3的推导式语法,代码更简洁易读
- 同时支持
float和Decimal两种常见小数类型 - 自动跳过非小数类型(如整数、字符串、布尔值),不修改原始结构
内容的提问来源于stack exchange,提问作者Emil Jessen
相关产品推荐
相关产品推荐

