首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在减少内存消耗的情况下有效地计算蟒蛇中分子的分子量?

如何在减少内存消耗的情况下有效地计算蟒蛇中分子的分子量?
EN

Stack Overflow用户
提问于 2021-12-23 19:00:35
回答 1查看 71关注 0票数 -1

这是我的代码,使用字典中元素的预定义值计算分子量(H2O、NO2、CO2、HCOOH)。

代码语言:javascript
复制
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语句中,如果在字母之后遇到一个数字,则需要从现有的元素质量中减去总数。我怎么才能取消这张额外的支票?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-23 21:06:25

您的代码看起来已经相当快了,但是如果您想要去掉您所看到的额外代码,您可以:

代码语言:javascript
复制
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

正如其他人指出,这将不支持多位数的定义。

如果您想支持像Cl2O2C4H10这样的分子,那么您可以尝试正则分裂,但它将比现在的速度慢:

代码语言:javascript
复制
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

这应该给你适当的权重:

代码语言:javascript
复制
print(moleculeMass("NO2"))
print(moleculeMass("C4H10"))  # wrong answer
print(moleculeMass("Cl2O4"))  # key error

print(moleculeMass2("NO2"))
print(moleculeMass2("C4H10"))
print(moleculeMass2("Cl2O4"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70466380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档