#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. Привет. Спасибо за вашу помощь. Я пытался самым глупым способом, вы сделали это так ясно. Я очень благодарен. Большое вам спасибо!