计算python中的分子量

时间:2017-05-05 04:17:22

标签: python

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

_Pragma

输出应如下所示:

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

Python 3.6.1 谢谢!

3 个答案:

答案 0 :(得分:3)

我确定了两个关键功能:

  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])
    

答案 1 :(得分:-1)

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

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

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

对于每个角色都做(这将是一个简单的循环,如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))
    

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

答案 2 :(得分:-1)

使用正则表达式来解析字符串,可以很容易地找到一个解决方案,可以处理两个字母元素,如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)