Форум сайта python.su
Спасибо большое!
Офлайн
py.user.nextCL - так не записывают хим.элементы, иначе СO - это угарный газ или кобальт?
Я добавил соляную кислоту в код xam1816
Офлайн
xam1816
CL - так не записывают хим.элементы, иначе СO - это угарный газ или кобальт?
NO и No cсоответственно оксид азота и нобелий
ant976
Входные данные
список формул молекул:['H2-S-O4', 'H2-O', 'NA-CL', 'H-CL', 'K-CL']
ant976Как видишь, по условию задачи натрий и хлор подаются на вход алгоритма в верхнем регистре. Значит, задача определяет свой язык формул на входе. Как видишь, в серной кислоте у него разделены сера и кислород, хотя обычно их пишут слитно, так как считают сульфатом. Так что можно предположить, что в этом языке входных формул алгоритма кобальт будет так же изолирован в отдельный атом через дефис, а в монооксиде углерода углерод и кислород будут разделены дефисом. Благодаря этому коллизии не будет.
Вывод программы
H2-O 18.015
H-CL 36.461
NA-CL 58.443
K-CL 74.551
H2-S-O4 98.078
Офлайн
py.user.next
улучшенная версия с обработкой ошибок
import re d ={} d['H'] = 1.008 d['O'] = 15.999 d['S'] = 32.066 d['NA'] = 22.990 d['CL'] = 35.453 d['K'] = 39.098 d['C'] = 10 d['L'] = 5#пример arr = ['H2-S-O4','H-CL','NA-CL','Y-CL','K-CL','H2-O','C-O2','H2U'] def mass(d,i): t = i.split('-') summ = 0 for j in t: match = re.search(r'\d',j) if match: idx = match.start() m,n = j[:idx],j[idx:] else: m,n = j,1 try: summ += d[m]*int(n) except: summ = -1 i='Error:'+ i break return i,round(summ,3) out = [] for i in arr: out.append(mass(d,i)) out.sort(key=lambda x: x[1]) for i in out: print('{0:24}{1:>5}'.format(*i))
Отредактировано vic57 (Ноя. 14, 2024 12:18:25)
Офлайн
vic57Сначала надо удалить ошибки из списка и составить чистый список, в котором все молекулы без ошибок, а потом подавать этот чистый список в алгоритм, который не занимается ничем посторонним, а только преобразует молекулы в молярные массы.
улучшенная версия с обработкой ошибок
Отредактировано py.user.next (Ноя. 14, 2024 18:28:16)
Офлайн