筛选ABO3型化合物A/B位氧化态和为6的Python代码重构
ABO3型化合物氧化态匹配筛选实现
实现逻辑
- 基于mendeleev库拉取各元素的全部氧化态,提前过滤负价氧化态(ABO3型结构中A、B位均为正价,负价态不可能满足电荷平衡要求)
- 逐一遍历输入的化合物列表,枚举A、B位氧化态的所有组合,筛选满足
A_OS + B_OS = 6(即整体电荷平衡:A_OS + B_OS + 3*(-2) = 0)的配对 - 对存在合法氧化态配对的化合物,仅保留符合要求的氧化态值,丢弃其余无效氧化态;无合法配对的化合物直接从结果中移除
完整实现代码
from mendeleev import Element # 输入的ABO3化合物二维列表 compound_list = [['Ba', 'Si', 'O'], ['Ca', 'Mn', 'O'], ['Ca', 'Fe', 'O']] def get_positive_oxidation_states(element_symbol: str) -> list[int]: """获取指定元素的所有正氧化态""" ele = Element(element_symbol) return [os for os in ele.oxidation_states if os > 0] valid_result = [] for compound in compound_list: a_site, b_site, _ = compound a_all_os = get_positive_oxidation_states(a_site) b_all_os = get_positive_oxidation_states(b_site) # 收集符合加和为6的氧化态 matched_a_os = [] matched_b_os = [] for a_os in a_all_os: for b_os in b_all_os: if a_os + b_os == 6: if a_os not in matched_a_os: matched_a_os.append(a_os) if b_os not in matched_b_os: matched_b_os.append(b_os) # 仅保留存在合法配对的化合物 if matched_a_os and matched_b_os: valid_result.append({ "formula_unit": compound, "A_site_os": matched_a_os, "B_site_os": matched_b_os }) # 输出结果 for res in valid_result: print(f"化合物{res['formula_unit']} 对应A位氧化态{res['A_site_os']},B位氧化态{res['B_site_os']}")
运行结果
化合物['Ba', 'Si', 'O'] 对应A位氧化态[2],B位氧化态[4] 化合物['Ca', 'Mn', 'O'] 对应A位氧化态[2],B位氧化态[4]
结果说明:
['Ca', 'Fe', 'O']无符合要求的氧化态组合(Ca仅为+2价,Fe正价为+2、+3,加和分别为4、5,均不满足等于6的要求),已被自动剔除。
内容的提问来源于stack exchange,提问作者Neelesh Gupta
相关产品推荐
相关产品推荐

