vic57
зачем так сложно?
Вот я добавил в твой код углерод и соляную кислоту
>>> d = {}
>>> d['H'] = '1.008'
>>> d['O'] = '15.999'
>>> d['S'] = '32.066'
>>> d['C'] = '12.011'
>>> d['NA'] = '22.990'
>>> d['CL'] = '35.453'
>>> d['K'] = '39.098'
>>> arr = ['H-CL', 'H2-S-O4','H-CL','NA-CL','K-CL','H2-O']
>>> out = []
>>> for i in arr:
... t = i
... for k in d:
... if k in t:
... t = t.replace(k,d[k]+'*')
... t = t.replace('-','+')
... t = t.replace('*+','+')
... if t.endswith('*'):
... t = t[:-1]
... out.append([i,round(eval(t),3)])
...
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "<string>", line 1, in <module>
NameError: name 'L' is not defined
>>> out.sort(key=lambda x: x[1])
>>> for i in out: print('{0:10}{1}'.format(*i))
...
>>>
Как видишь, ничего не выводится, так как твой код пытается найти элемент L в таблице Менделеева.
А вот я добавил в свой код углерод, хлор, соляную кислоту и метан
>>> def count_mols(lst):
... out = [count_mol(i) for i in lst]
... return out
...
>>> def count_mol(mol):
... atom_lst = mol.split('-')
... out = sum([count_atom(i) for i in atom_lst])
... return out
...
>>> def count_atom(atom):
... element = ''
... number = ''
... for c in atom:
... if c.isalpha():
... element += c
... elif c.isdigit():
... number += c
... num = 1
... if number:
... num = int(number)
... out = count_mass(element, num)
... return out
...
>>> def count_mass(element, number):
... dct = {
... 'H': 1.008,
... 'C': 12.011,
... 'CL': 35.453
... }
... out = dct[element] * number
... return out
...
>>> count_mols(['H', 'H2', 'H2-H3', 'H-CL', 'C-H4'])
[1.008, 2.016, 5.04, 36.461000000000006, 16.043]
>>>
Как видишь, у меня это не вызвало вообще никаких проблем.
Это потому, что структурная парадигма программирования придаёт коду много скрытой прочности. Мы можем один раз написать код и не париться по поводу того, как его быстро поменять под какие-либо изменившиеся условия.
Так что тот, кто пренебрегает подобными теориями, пишет очень много кодов, которые потом выбрасываются как переставшие работать, сломавшиеся из-за изменившихся условий. А тот, кто соблюдает эти теории, пишет прочные коды, которые переживают время, эпохи.
Например, язык Pascal сдох, когда сдох DOS, потому что Pascal был привязан к DOS'у. И теперь паскаля фактически нет. А вот язык C до сих пор живёт и здравствует, потому что он пережил несколько разных эпох, так как он не был привязан ни к чему.