我有这本字典,其中键代表原子类型,值代表原子质量:
mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071,
'P': 30.973762}
我想做的是创建一个给定分子的函数,例如('H2-N-C6-H4-C-O-2H')
,迭代质量
字典并计算给定分子的原子质量。质量值必须乘以原子类型后面的数字:H2 = H.value * 2
我知道首先我必须隔离给定分子的键,为此我可以使用 string.split('-')
。然后,我想我可以使用和 if
block 来建立一个条件,如果给定分子的键在字典中则完成。但后来我不知道应该如何继续为字典的每个键找到质量。
预期的结果应该是这样的:
mass_counter('H2-N15-P3')
out[0] 39351.14
我该怎么做?
编辑:
这是我目前尝试过的
# Atomic masses
mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071,
'P': 30.973762}
def calculate_atomic_mass(molecule):
"""
Calculate the atomic mass of a given molecule
"""
mass = 0.0
mol = molecule.split('-')
for key in mass:
if key in mol:
atom = key
return mass
print calculate_atomic_mass('H2-O')
print calculate_atomic_mass('H2-S-O4')
print calculate_atomic_mass('C2-H5-O-H')
print calculate_atomic_mass('H2-N-C6-H4-C-O-2H')
最佳答案
鉴于所有组件的形状都是 Aa123
,在这里用正则表达式识别部件可能更容易,例如:
import re
srch = re.compile(r'([A-Za-z]+)(\d*)')
mass = {'H': 1.007825, 'C': 12.01, 'O': 15.9994, 'N': 14.0067, 'S': 31.972071, 'P': 30.973762}
def calculate_atomic_mass(molecule):
return sum(mass[a[1]]*int(a[2] or '1') for a in srch.finditer(molecule))
这是我们的 regular expression [wiki]因此捕获了一系列 [A-Z-a-z]
和一个(可能为空的)数字序列 (\d*
),它们分别是第一和第二捕获组,并且因此可以获得与 a[1]
和 a[2]
的匹配。
这会产生:
>>> print(calculate_atomic_mass('H2-O'))
18.01505
>>> print(calculate_atomic_mass('H2-S-O4'))
97.985321
>>> print(calculate_atomic_mass('C2-H5-O-H'))
46.06635
>>> print(calculate_atomic_mass('H2-N-C6-H4-C-O-2H'))
121.130875
>>> print(calculate_atomic_mass('H2-N15-P3'))
305.037436
因此,我们将第一个捕获组(原子的名称)的 mass[..]
的总和乘以末尾的数字,我们使用 '1'
如果找不到这样的号码。
或者我们可以先拆分数据,然后寻找原子部分和数字部分:
import re
srch = re.compile(r'^([A-Za-z]+)(\d*)$')
def calculate_atomic_mass(molecule):
"""
Calculate the atomic mass of a given molecule
"""
result = 0.0
mol = molecule.split('-')
if atm in mol:
c = srch.find(atm)
result += result[c[1]] * int(c[2] or '1')
return result
关于python - 如何遍历字典并对其元素进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53025584/