Вероятно, это поможет, если мы разделим программу на отдельные функции.Сначала мы определяем аминокислоты и атомный вес (соответствующих) атомов:
aminoacid = {
'I': 'C6H13NO2',
'L': 'C6H13NO2',
'K': 'C6H14N2O2',
'M': 'C5H11NO2S',
'F': 'C9H11NO2',
'T': 'C4H9NO3',
'W': 'C11H12N2O2',
'V': 'C5H11NO2',
'R': 'C6H14N4O2',
'H': 'C6H9N3O2',
'A': 'C3H7NO2',
'N': 'C4H8N2O3',
'D': 'C4H7NO4',
'C': 'C3H7NO2S',
'E': 'C5H9NO4',
'Q': 'C5H10N2O3',
'G': 'C2H5NO2',
'P': 'C5H9NO2',
'S': 'C3H7NO3',
'Y': 'C9H11NO3'
}
monoisotopic = {
'S': 31.972,
'C': 12.0000,
'H': 1.0078,
'O': 15.9949,
'N': 14.0031
}
Затем можно определить функцию для расчета веса аминокислоты (или любого другого атома):
from re import findall as refindall
def molecular_weight(molecule):
return sum(
monoisotopic[atom] * int(num or '1')
for atom, num in refindall(r'([A-Z][a-z]*)(\d*)', molecule)
)
Затем мы можем просто суммировать молекулярные массы аминокислот, например:
def proteine_mass(proteine):
return sum(molecular_weight(aminoacid[char]) for char in proteine)
Например:
>>> proteine_mass('WATER')
733.3594
>>> proteine_mass('AILWNG')
762.4109000000001
(конечно, это не H 2 O, вероятно, указанного выше белка не существует)