-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathMolecule to atoms.py
60 lines (59 loc) · 2.18 KB
/
Molecule to atoms.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def combine(dict1, dict2):
for i in dict2:
if i in dict1:
dict1[i] += dict2[i]
else:
dict1[i] = dict2[i]
return dict1
def parse_molecule (formula):
counts = {}
last = ""
i=0
while i < len(formula):
if formula[i].isdigit() == True:
if i + 1 < len(formula):
if formula[i + 1].isdigit() == True:
counts[last] += int(formula[i:i+2]) - 1
i+=1
else:
counts[last] += int(formula[i])-1
else:
counts[last] += int(formula[i]) - 1
elif formula[i] == ")" or formula[i] == "]" or formula[i] == "}":
return [i+1, counts]
elif formula[i] == "(" or formula[i] == "[" or formula[i] == "{":
temp = parse_molecule(formula[i+1:])
i += temp[0]
if i+1 < len(formula):
if formula[i+1].isdigit()==True:
i+=1
for key, value in temp[1].items():
temp[1][key] = value * int(formula[i])
counts = combine(temp[1], counts)
else:
if formula[i].isupper()==True:
if i+1 < len(formula):
if formula[i+1].islower()==True:
if formula[i:i+2] in counts:
counts[formula[i:i+2]]+=1
last = formula[i:i+2]
i+=1
else:
counts[formula[i:i+2]] = 1
last = formula[i:i+2]
else:
if formula[i] in counts:
counts[formula[i]] = 1
last = formula[i]
else:
counts[formula[i]] = 1
last = formula[i]
else:
if formula[i] in counts:
counts[formula[i]] = 1
last = formula[i]
else:
counts[formula[i]] = 1
last = formula[i]
i += 1
return counts