Я немного расширил ваш запрос и добавил класс для каждой молекулы.
Класс содержит три атрибута:
- raw_element
- структура молекулы
- масса молекулы
класс можно расширить с помощью рисунка молекулы или других элементов.
Класс:
class molecule:
def __init__(self, raw_element, atom_mass_table):
self.amt = atom_mass_table
self.raw_element = raw_element
self.molecule_structur = self.get_struc()
self.molecule_mass = self.cal_mass()
def get_struc(self):
return [self._split_nodes(e) for e in self._split_in_nodes()]
def cal_mass(self):
sum = 0
for i in self.molecule_structur:
sum += self.amt[i[0]] * i[1]
return sum
def _split_nodes(self, node):
s = ""
n = ""
for l in node:
if l.isalpha():
s += l
elif l.isdigit():
n += l
if n is None:
n = 1
return (s, int(n))
def _split_in_nodes(self):
new_el = [e.isupper() for e in self.raw_element]
el_str = []
pos = 0
for _ in range(sum(new_el)):
if True in new_el[pos+1:]:
end = pos + new_el[pos+1:].index(True)+1
else:
end = len(new_el)
el_str.append(self.raw_element[pos:end])
pos = end
return el_str
Классу нужно только:
- описание необработанного элемента - C12H22O11
- предоставленная вами atom_mass_table - я не включил его в класс, чтобы потом было проще его расширить.
Итак, чтобы проверить код:
if __name__ == "__main__":
element = input("Please enter your Molecule: ")
molecule = Molecule(element, atom_mass_table)
print(molecule.molecule_structur)
print(molecule.molecule_mass)
Ввод:
Please enter you Molecule: C32H128O64
Выход:
[('C', 32), ('H', 128), ('O', 64)]
1537.33376
Надеюсь, это поможет, и когда вы улучшите это приложение, вы можете пригласить меня к себе на GitHub Project.