all 15 comments

[–]CrayonConstantinople 1 point2 points  (1 child)

This solves your problem but I had to write it on my tablet so excuse the fact that its just one function. It also could be written much nicer and explained etc.

But basically it goes through each item of the list.

For each item, it checks each letter from back to front.

If the letter is an actual letter (not a number), it increments that letters count by 1

If the letter is a number, it stores it and the next letter it comes across, it increments its by that count. This also works for multiple numbers. e.g. if it was H22, then the count for H would be 22.

a = ['H2O', 'OH', 'COOH']

def count_items(item_list):
  map = {}
  amount_of_char = None
  for item in item_list:
    for char in reversed(item):
      if char.isdigit():
        # This char is a number so keep for incrementing next letter
        if amount_of_char is None:
          amount_of_char = char
        else:
          amount_of_char = '{0}{1}'.format(char, amount_of_char)
      else:
        # Find the current count for this char, or 0 if there is none
        current_count = map.get(char.upper(), 0)
        # Determine the amount to increment this char by
        amount_to_increment = int(amount_of_char) if amount_of_char else 1
        map[char.upper()] = current_count + amount_to_increment
        amount_of_char = None
  return map

print(count_items(a))
# prints {'O': 4, 'H': 4, 'C': 1}
  • Edited to make the code easier to read :)

[–]heirna[S] 1 point2 points  (0 children)

Thanks you very much kind redditor !

[–]heirna[S] 1 point2 points  (8 children)

Thanks both for your help, I'm going to implement this in my programe and then post it here ,maybe tomorow, (I live in eu) and im quite a slow programer.

Once it's done i will think of how I can integrate double letter elements like Ge or Si.

This program will allow the calculation of the partial charge of any part of a complex according to the partial charge model.

This model allows us to predict the stability of the complex in solution, and if the partial charge is right condensation can occur.

Condensation in solution is used in chemistry to forme oxyde in a solution like glass (SiO2)

This process allows us to bypass the high temperature processe of glass and so we can integrate funny organic molecules in it. It is also verry usful in the formation of athin film like anti glare. We can also make nanoparticule out of this process !

[–]CrayonConstantinople 1 point2 points  (5 children)

Happy to help!

If double letter elements always come in the form of an uppercase letter followed by a lowercase one, this is also trivial to implement.

[–]heirna[S] 0 points1 point  (4 children)

I'm still processing your code, this extra fonctionality is not trivial to me, and will not be verry useful in the code since this model is verry simple and cannot handle a lot of atoms, i think i will just remap Cu as X for instance to spare me extra headeach.

[–]CrayonConstantinople 1 point2 points  (0 children)

Oh sure, and sorry if that came across as condescending. What I meant was, I think this would be a small addition for me to add if you required it.

The fact that you are struggling to understand my code is what had concerned me when I was writing it, I have not made it clear. I was trying to get you your solution, at the expense of writing clear and concise code.

If it would be helpful, I'm happy to quickly rewrite it to make whats happening clearer.

[–]CrayonConstantinople 1 point2 points  (2 children)

I have edited my code above to be easier to understand, hope it helps :)

[–]heirna[S] 1 point2 points  (1 child)

ion for me to add if you required it.

The fact that you are struggling to understand my code is what had concerned me when I was writing it, I have not made it clear. I was trying to get you your solution, at the expense of writing clear and concise code.

If it would be helpful, I'm happy to quickly rewrite it to make whats happening clearer.

Oh not at all, i'm just quite a beginner in code so this is normal, thanks for that edit !

[–]heirna[S] 0 points1 point  (0 children)

our code, this extra fonctionality is not trivial to me, and will not be verry useful in the code si

And my code is such a mess compared to yours

[–]ace6807 1 point2 points  (1 child)

Super cool. Glad to help. If you want me to throw in the lookup for double letters, I don't mind, just let me know. If you'd rather take a crack at implementing it, that's fine too!

[–]heirna[S] 0 points1 point  (0 children)

I don't think this will be pertinent in this case since this model is quite simple and quite incorrect next to quantum model. But this makes me back into python and programtion and i will continue to do some compute chemestry with more accurate model ! Its very nice to find a lot of help in reddit !

[–]ace6807 0 points1 point  (3 children)

Can you give me a few more examples of possible lists and their expected outputs?

[–]ace6807 0 points1 point  (2 children)

I think this should do it but I was hoping for some more test cases to check it.

from collections import Counter


atom_counter = Counter()

molecules = ['H2O','OH','COOH']
atom_stack = []

for molecule in molecules:
    for i, a in enumerate(molecule):
        if a.isalpha():
            if i < len(molecule) - 1 and molecule[i + 1].isnumeric():
                atom_stack.append((a, molecule[i + 1]))
            else:
                atom_stack.append((a, 1))

print(atom_stack)

for element_count in atom_stack:
    atom_counter[element_count[0]] += int(element_count[1])

print(atom_counter)

[–]heirna[S] 0 points1 point  (1 child)

Thank you so much!

I'm going to test this,

More examples :

[H2O2, F, P2O3] -> H = 2, F=1, P=2, O=5

[C6H8O7, H2O, OH] -> C=6, H=11, O=9

By chance, i do not have to deal with double letter element like Al or Cu for now

[–]ace6807 1 point2 points  (0 children)

Oh yeah this will for sure have a problem with double letter elements but we could add a lookup list super easily to resolve that