计算蟒蛇的分子量

  • 本文关键字:分子量 计算 python
  • 更新时间 :
  • 英文 :


所以我想创建一个程序来计算分子量,仅使用三个分子C = 12.0110,H = 1.0079和O = 15.9994。用户将输入一个类似 H2O 的公式,程序应输出计算权重 '18.01528'。 我只是困惑于如何创建一种将字母与数字相乘的方法,以及如何计算输入的公式是两个字符长还是更长。 到目前为止,我有一本字典:

elements = {
'C' : 12.0110,
'H' : 1.0079,
'O' : 15.9994
}

输出应如下所示:

Enter a chemical formula, or just the enter key to quit: C2H5OH
The molecular weight is 46.0688

蟒蛇 3.6.1 谢谢!

我会确定两个关键函数:

  1. 验证/解析公式,例如,H2O成化学符号及其出现的次数。 例如,H20[('H', 2), ('O', 1)]

    您需要注意大写后跟小写字母的化学符号以及多位数字。这可能有些棘手,可能会分为几个阶段。

  2. 解析公式的权重求和。 即,对于[('H', 2), ('O', 1)]做类似的事情

    parsed_formula = parse(formula) # [('H', 2), ('O', 1)]
    return sum([weight[symbol] * number] for symbol, number in parsed_formula])
    

你只需要解析字符串(H2O或其他什么),并检查一个元素后面是否跟着一个数字(或数字),另一个元素或什么都没有(字符串的末尾)。

您还需要考虑多个数字彼此相邻的情况(H22O;是的,我知道这样的元素是不可能的,但这只是一个示例)。

分子的所有部分将存储在一个列表中,每个原子(或多个相同的原子)分别存储。这将允许您对列表运行简单的总和以获得最终结果。

对于每个字符 do(这将是一个简单的循环,例如for char in user_input: ...):

  • 检查它是否是字母字符 - 如果是,请将其替换为原子重量(或任何名称)并将其存储在列表中:

    f = []
    f = [1]     # let's say H has a mass of 1 :D
    f = [1, 2]  # let's say O has a mass of 2 :D
    

    您必须在提供的该表中找到该元素。就个人而言,我会使用字典来更快,更轻松地访问。元素的字母表示将是键,它的质量将是值。如果您需要处理由多个字符组成的元素(例如:Pb),您可以调整下一步来处理数字(没有将串联字符转换为整数的最后一部分):

    e_tmp = ''
    e_tmp = e_tmp + 'P'  # P
    e_tmp = e_tmp + 'b'  # Pb
    # elements below is a dictionary. You should do an extra step to check if the key is present
    a_mass = elements.get(e_tmp)
    f.append(a_mass)
    
  • 检查它是否是数字字符 - 将其存储在临时变量中(作为字符串,不要将其转换为数字!继续连接数字字符,直到到达用户输入的末尾或其他字母字符:

    tmp = ''
    tmp = tmp + '2'
    ...
    

    现在你有一个只有数字字符的字符串,你可以把它转换成一个整数:

    tmpInt = int(tmp) # tmpInt = 2
    

    现在,将插入的元素列表中的最后一个单元格与该数字相乘。您可以使用变量跟踪该单元格的索引,以便更轻松地访问:

    f = []
    f = [1]
    tmp = ''
    tmp = tmp + '2'
    tmpInt = int(tmp)
    f[last] = f[last]*tmpInt
    
  • 到达用户输入的字符串的末尾后,您可以对所有元素求和:

    molecular_weight = sum(map(int, f))
    

编辑:这是一个非常广泛的示例,如何使用字典存储元素周期表,尽管作为仅使用dict进行内部数据管理的自定义类。

使用正则表达式解析字符串,很容易想出一种解决方案,可以处理两个字母元素(如Pb)和多位数字(如C10H3)。请注意,这仍然不会处理化合物。

compounds = {
'C' : 12.0110,
'H' : 1.0079,
'O' : 15.9994,
'Pb': 81.4  # Added to show Aa elements working, not actual weight of Pb!
}
pattern = re.compile(r'([A-Z][a-z]?)(d+)?')
z = 'Pb4O5'
total = 0.0
for element, n_str in re.findall(pattern, z):
if n_str:
n = int(n_str)
else:
# If there's no number for current element, n_str = ''
n = 1
total += compounds[element] * n
print(total)

最新更新