1

For context, I am trying to create a program that calculates the molar mass of a compound given its chemical formula. For each capital letter in the user's input (which is converted into a list), I plan on adding the string "+".

However, when I assign a list to the variable 'position' I run into the following error:

Traceback (most recent call last):
  File "/Users/robertg21/PycharmProjects/MolecularMassCalculator/MolecularMassCalculator.py", line 42, in <module>
    new_formula.insert(return_index(), "+")
  File "/Users/robertg21/PycharmProjects/MolecularMassCalculator/MolecularMassCalculator.py", line 35, in return_index
    position = list(formula.index(element))
TypeError: 'int' object is not iterable

Here is my code:

# This program calculates the molar mass of a compound given its chemical formula and number of atoms.

# Dictionary containing relative atomic mass of elements
relative_atomic_mass = {'H': 1.00794, 'He': 4.002602, 'Li': 6.941, 'Be': 9.012182, 'B': 10.811, 'C': 12.0107, 'N': 14.0067,
              'O': 15.9994, 'F': 18.9984032, 'Ne': 20.1797, 'Na': 22.98976928, 'Mg': 24.305, 'Al': 26.9815386,
              'Si': 28.0855, 'P': 30.973762, 'S': 32.065, 'Cl': 35.453, 'Ar': 39.948, 'K': 39.0983, 'Ca': 40.078,
              'Sc': 44.955912, 'Ti': 47.867, 'V': 50.9415, 'Cr': 51.9961, 'Mn': 54.938045,
              'Fe': 55.845, 'Co': 58.933195, 'Ni': 58.6934, 'Cu': 63.546, 'Zn': 65.409, 'Ga': 69.723, 'Ge': 72.64,
              'As': 74.9216, 'Se': 78.96, 'Br': 79.904, 'Kr': 83.798, 'Rb': 85.4678, 'Sr': 87.62, 'Y': 88.90585,
              'Zr': 91.224, 'Nb': 92.90638, 'Mo': 95.94, 'Tc': 98.9063, 'Ru': 101.07, 'Rh': 102.9055, 'Pd': 106.42,
              'Ag': 107.8682, 'Cd': 112.411, 'In': 114.818, 'Sn': 118.71, 'Sb': 121.760, 'Te': 127.6,
              'I': 126.90447, 'Xe': 131.293, 'Cs': 132.9054519, 'Ba': 137.327, 'La': 138.90547, 'Ce': 140.116,
              'Pr': 140.90465, 'Nd': 144.242, 'Pm': 146.9151, 'Sm': 150.36, 'Eu': 151.964, 'Gd': 157.25,
              'Tb': 158.92535, 'Dy': 162.5, 'Ho': 164.93032, 'Er': 167.259, 'Tm': 168.93421, 'Yb': 173.04,
              'Lu': 174.967, 'Hf': 178.49, 'Ta': 180.9479, 'W': 183.84, 'Re': 186.207, 'Os': 190.23, 'Ir': 192.217,
              'Pt': 195.084, 'Au': 196.966569, 'Hg': 200.59, 'Tl': 204.3833, 'Pb': 207.2, 'Bi': 208.9804,
              'Po': 208.9824, 'At': 209.9871, 'Rn': 222.0176, 'Fr': 223.0197, 'Ra': 226.0254, 'Ac': 227.0278,
              'Th': 232.03806, 'Pa': 231.03588, 'U': 238.02891, 'Np': 237.0482, 'Pu': 244.0642, 'Am': 243.0614,
              'Cm': 247.0703, 'Bk': 247.0703, 'Cf': 251.0796, 'Es': 252.0829, 'Fm': 257.0951, 'Md': 258.0951,
              'No': 259.1009, 'Lr': 262, 'Rf': 267, 'Db': 268, 'Sg': 271, 'Bh': 270, 'Hs': 269, 'Mt': 278,
              'Ds': 281, 'Rg': 281, 'Cn': 285, 'Nh': 284, 'Fl': 289, 'Mc': 289, 'Lv': 292, 'Ts': 294, 'Og': 294,
}

# Asks for user input for chemical formula
chemical_formula = input("Enter chemical formula, or press return to quit: ")
formula = list(chemical_formula)

# Copies list and assigns it to variable new_formula
new_formula = formula.copy()

# Function returns index of letters that are an upper case letter.
def return_index():
    for element in formula:
        if element.isalpha() and element.isupper():
            position = list(formula.index(element))
            return position


# Inserts + before for each Capitalized letter in list.
for item in formula:
    if item.isalpha() and item.isupper():
        new_formula.insert(return_index(), "+")

print(new_formula)

Can anyone help?

Thanks.

2
  • 1
    list(formula.index(element)) won't work, index returns an integer, you cannot create a list out of an integer. Commented Mar 12, 2019 at 16:59
  • Do you have an example of a formula for the input? Commented Mar 12, 2019 at 17:00

1 Answer 1

1
def return_index():
    for element in formula:
        if element.isalpha() and element.isupper():
            position = list(formula.index(element))
            return position

this is plain wrong. list(formula.index(element)) won't work, index returns an integer, you cannot create a list out of an integer. returning in the middle of a loop makes no sense either.

Fortunately, your comment is clear enough to figure out what you want to do.

You want to use enumerate to get the index & the element, and a list comprehension to filter the indexes you want to return. Also your function should take formula as a parameter, not rely on a global variable:

# Function returns index of letters that are an upper case letter.
def return_index(formula):
    return [position for position,element in enumerate(formula) if element.isupper()]

note that isalpha is already covered by isupper, you can remove that test.

Sign up to request clarification or add additional context in comments.

3 Comments

Just one last thing. When envoking the new function return_index how would you call for the int values in the list?
I don't understand
As part of your suggested solution , the new function ‘return_index’ would no longer provide an integer value for .insert. Instead it would pass a list. How would you make it so that it passes the integer values from the list?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.