<p>根据我对你期望的结果的理解,我想出了一个不同的方法。这个版本将使用原子量字典,regex解析复合字符串,并使用循环来计算。它非常灵活,但是它需要你建立原子质量的字典,这不难,只是有点乏味。它对评论中提到的输入有一些要求</p>
<pre><code>import re
atomic_masses = {'Si': 28.0855, 'O': 15.999}
compound = input('Please enter a compound and amount: ')
amount_pat = re.compile(r'(\d+)g') # compound mass must end in the letter g
element_pat = re.compile(r'([A-Z][a-z]?\d*)') # elemental symbols must be properly capitalized (Si, not si)
sym_pat = re.compile(r'[A-Z][a-z]?') # elemental symbols must be properly capitalized (Si, not si)
qty_pat = re.compile(r'\d+')
mass = int(amount_pat.search(compound)[1])
elements = []
# finds each element in the compound and makes a list of (element, parts) tuples
for element in element_pat.finditer(compound):
element = element[0]
symbol = sym_pat.search(element)[0]
if any(c.isdigit() for c in element):
qty = int(qty_pat.search(element)[0])
else:
qty = 1
elements.append((symbol, qty))
# Calculates and prints total Molecular Mass for the compund
molecular_mass = sum(el[1] * atomic_masses[el[0]] for el in elements)
print(f'\nTotal Molecular Mass: {molecular_mass}\n')
# Calculates and prints the mass for each element
for tup in elements:
unit_mass = (mass / molecular_mass) * atomic_masses[tup[0]] * tup[1]
print(f'{tup[0]}: {unit_mass:.4f}g')
</code></pre>
<p>输出示例:</p>
^{pr2}$
<h3>编辑:</h3>
<p>为了适应输入的十进制质量,我们可以将<code>amount_pat</code>中的regex改为<code>r'(\d*.\d+)g'</code>。现在它将接受<code>.003g</code>或{<cd4>}等值。它仍然不需要kg或mg,但是如果您查找内置的<code>re</code>包,您可以了解regex是如何工作的,并从中进行更改。<a href="http://regex101.com" rel="nofollow noreferrer">regex101</a>对于regex也是一个很好的资源,因为它允许尝试和错误的方法来学习。我还在<code>mass</code>赋值语句中将<code>int</code>改为{<cd7>}</p>
<p>不过,我改变了元素质量环,以适应mg和kg。如果您希望进一步扩展,只需采用我在这里开始的模式并进一步扩展:</p>
<pre><code>for tup in elements:
unit_mass = (mass / molecular_mass) * atomic_masses[tup[0]] * tup[1]
if unit_mass > 1000:
unit_mass /= 1000
unit = 'kg'
elif unit_mass < .01:
unit_mass *= 1000
unit = 'mg'
else:
unit = 'g'
print(f'{tup[0]}: {unit_mass:.4f}{unit}')
</code></pre>
<p>新示例输出:</p>
<pre><code>Please enter a compound and amount: .003g H2O
Total Molecular Mass: 18.01488
H: 0.3357mg
O: 2.6643mg
</code></pre>