Python遍历嵌套列表计算化学分子式各元素质量百分比
修复方案
根因说明
仅输出最后一个元素质量占比的问题,核心原因是原有compute_mass_percentage函数在遍历嵌套列表时,要么没有累加各元素质量、每次循环直接覆盖结果变量,要么没有统计总摩尔质量,仅保留了最后一次循环的计算值。
可直接使用的修复代码
1. 重写compute_mass_percentage函数
该实现支持任意深度的嵌套列表、任意数量的元素,自动统计各元素总质量和总摩尔质量后计算占比:
def compute_mass_percentage(parsed_formula, periodic_table): # 存储各元素总质量、整个分子的总摩尔质量 element_total_mass = {} molecule_total_mass = 0.0 # 递归遍历嵌套的分子式解析结果 def recursive_traverse(nested_item, global_multiplier=1): nonlocal molecule_total_mass for entry in nested_item: # 匹配单个元素条目:格式为[元素符号, 原子个数] if isinstance(entry[0], str): elem_symbol, atom_count = entry[0], entry[1] current_mass = periodic_table[elem_symbol] * atom_count * global_multiplier # 累加元素总质量 if elem_symbol in element_total_mass: element_total_mass[elem_symbol] += current_mass else: element_total_mass[elem_symbol] = current_mass # 累加分子总质量 molecule_total_mass += current_mass # 匹配嵌套的基团条目:格式为[基团解析列表, 基团重复次数] else: group_content, group_multiplier = entry[0], entry[1] recursive_traverse(group_content, global_multiplier * group_multiplier) recursive_traverse(parsed_formula) # 计算质量百分比,保留两位小数 result = [] for elem, mass in element_total_mass.items(): percentage = round((mass / molecule_total_mass) * 100, 2) result.append((elem, percentage)) return result
2. 调整main()函数中的调用逻辑
原有调用大概率是仅打印了返回结果的最后一项,修改为遍历所有结果输出即可:
# 只需替换原有的compute_mass_percentage调用和输出部分,变量名和你现有代码保持一致即可 mass_percentage_list = compute_mass_percentage(parsed_formula, periodic_table) print("各元素质量占比:") for elem, pct in mass_percentage_list: print(f"{elem}: {pct}%")
效果验证
修复后不管分子式解析后的嵌套层级多深、包含多少种元素,都能完整统计所有元素的质量占比,不会出现结果被覆盖的问题。
内容的提问来源于stack exchange,提问作者stackedtoohigh
相关产品推荐
相关产品推荐

