这是我的代码,使用字典中元素的预定义值计算分子量(H2O、NO2、CO2、HCOOH)。
mass = {"H":1, "O":16, "C":12, "N":14}
def moleculeMass(moleculeName):
p = 0
total = 0
for i in moleculeName:
if i.isalpha():
p = i
total += mass[i]
else:
total = total - mass[p] + (mass[p] * int(i))
return total
compoundName = input("input molecule name: ")
print(moleculeMass(compoundName))在上面的else语句中,如果在字母之后遇到一个数字,则需要从现有的元素质量中减去总数。我怎么才能取消这张额外的支票?
发布于 2021-12-23 21:06:25
您的代码看起来已经相当快了,但是如果您想要去掉您所看到的额外代码,您可以:
def moleculeMass(moleculeName):
total = 0
for i in moleculeName:
if i.isalpha():
mass_p = mass[i]
total += mass_p
else:
total += mass_p * (int(i) -1)
return total正如其他人指出,这将不支持多位数的定义。
如果您想支持像Cl2O2或C4H10这样的分子,那么您可以尝试正则分裂,但它将比现在的速度慢:
mass = {
"H" : 1,
"O" : 16,
"C" : 12,
"N" : 14,
"Cl" : 35
}
re_pattern = re.compile(r"([A-Z][a-z]?|\s+)")
def moleculeMass2(moleculeName):
total = 0
for symbol in [symbol for symbol in re_pattern.split(moleculeName) if symbol]:
if symbol.isalpha():
prior_mass = mass[symbol]
total += prior_mass
else:
total += prior_mass * (int(symbol) - 1)
return total这应该给你适当的权重:
print(moleculeMass("NO2"))
print(moleculeMass("C4H10")) # wrong answer
print(moleculeMass("Cl2O4")) # key error
print(moleculeMass2("NO2"))
print(moleculeMass2("C4H10"))
print(moleculeMass2("Cl2O4"))https://stackoverflow.com/questions/70466380
复制相似问题