Python: счетчик химических элементов

#python #split #counter

#python #сплит #счетчик

Вопрос:

Я хочу получить элементы для данной смеси. Например, для состава смеси воздуха (O2 и N2) и гексана (C6H14), заданного dict с соответствующими молярными числами

 mix = {'O2': 1, 'N2': 3.76, 'C6H14': 0.01}
  

Я хочу получить следующее:

 {O: 2, N: 7.52, C:0.06, H: 0.14}
  

Другой пример:

 mix = {'C6H14': 1, 'C9H20': 1}
  

должен давать

 {H: 34, C: 15}
enter code here
  

Последовательность dict это не важно. Я пытался с re.split, но я не получаю никакого прогресса. Если кто-нибудь может мне помочь, я буду благодарен.

Редактировать: Привет, возможно, я не был ясен в своем вопросе, но я хочу подсчитать количество атомов в смеси. Я попытался использовать re.findall из библиотеки регулярных выражений. Я попытался отделить числа от других символов. Пример:

 mix  = {'C6H14': 1, 'C9H20': 1}
atmix = []
mix = {'O2': 1, 'N2': 3.76, 'C6H14': 0.01}
for x in mix.keys():
    tmp = re.findall(r'[A-Za-z] |d ', x)
    tmp = list(zip(tmp[0::2], tmp[1::2]))
    atmix.append(tmp)

  

для того, чтобы знать, что у меня есть:

 >>> atmix
[(['O'], ['2']), (['N'], ['2']), (['C', 'H'], ['6', '14'])]
  

Это список с кортежами веществ и их количеством атомов. Отсюда мне нужно получить каждое вещество и соотнести его с количеством атомов, умноженным на количество молей, заданное словарем mix, но я не знаю как. То, как я пытаюсь отделить вещества и их атомы от смеси, кажется глупым. Мне нужен лучший способ классифицировать эти вещества и их атомы и выяснить, как связать это с количеством молей.

Заранее благодарю

Комментарии:

1. Вы сказали, что пытались с re.split … не могли бы вы рассказать об этом подробнее? Лично я не думаю, что этот вопрос заслуживает отрицательной оценки

Ответ №1:

Вы можете перебирать mix dict, используя тщательно разработанное регулярное выражение, чтобы отделить каждый элемент от его количества.

 import re
from collections import defaultdict

mix = {'O2': 1, 'N2': 3.76, 'C6H14': 0.01}
out = defaultdict(float)
regex = re.compile(r'([A-Z] ?)(d )?')

for formula, value in mix.items():
    for element, count in regex.findall(formula):
        count = int(count) if count else 1  # supporting elements with no count,
                                            # eg. O in H2O
        out[element]  = count * value

print(out)
  

выходы

 defaultdict(<class 'float'>, {'O': 2.0, 'N': 7.52, 'C': 0.06, 'H': 0.14})
  

Комментарии:

1. Привет. Спасибо за вашу помощь. Я пытался самым глупым способом, вы сделали это так ясно. Я очень благодарен. Большое вам спасибо!