所以我想用三个分子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 谢谢!
答案 0 :(得分:3)
我确定了两个关键功能:
验证/解析公式,例如H2O
到化学符号及其发生的次数。例如,H20
到[('H', 2), ('O', 1)]
。
您需要注意化学符号,这些符号是大写字母,后跟小写字母,数字超过一位数。这可能有些棘手,可能分为几个阶段。
从解析的公式中总结权重。即,[('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)