Python 将列表中的一个整数乘以列表中的一个字

Python 将列表中的一个整数乘以列表中的一个字,python,Python,我不知道如何将字符串后面的数字乘以字符串。我想找到化合物的RMM,所以我开始制作RMM字典,然后将它们添加到一起。我的问题是H2O等化合物 name = input("Insert the name of a molecule/atom to find its RMM/RAM: ") compound = re.sub('([A-Z])', r' \1', name) Compound = compound.split(' ') r = re.split('(\d+)', compound)

我不知道如何将字符串后面的数字乘以字符串。我想找到化合物的RMM,所以我开始制作RMM字典,然后将它们添加到一起。我的问题是H2O等化合物

name = input("Insert the name of a molecule/atom to find its RMM/RAM: ")
compound = re.sub('([A-Z])', r' \1', name)
Compound = compound.split(' ')
r = re.split('(\d+)', compound)
例如:

When name = H2O
Compound = ['', 'H2', 'O']
r = ['H', '2', 'O']
print("H"*2) # HH
print(2*"H") # HH
In [2]: def findElements(molecule):
    ...:      groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', molecule)]
    ...:      return [c for cG in groups for c in cG]

In [3]: findElements("H2O5S7D")
Out[3]: ['H', 'H', 'O', 'O', 'O', 'O', 'O', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'D']
我想用2乘以H,得到一个值“['H','H','O']”

TLDR:我希望列表中名称后面的整数打印之前列出的对象“x”的次数(例如,[O,2]=>oo,[C,O,2]=>coo)


这个问题有点复杂,如果我能澄清,请告诉我。谢谢。

你也许可以做一些像

compound = 'h2o' 
final = []
for x in range(len(compound)):
    if compound[x].isdigit() and x != 0:
        for count in range(int(compound[x])-1):
            final.append(compound[x-1])
    else:
       final.append(compound[x])

在定义了
化合物之后,以下内容如何:

test = re.findall('([a-zA-z]+)(\d*)', compound)
expand = [a*int(b) if len(b) > 0 else a for (a, b) in test]
匹配1个或多个实例的字母,后跟可选数字-如果没有数字,我们只返回字母,如果有数字,我们按适当的值复制字母。这并没有完全返回您期望的结果-它将返回
['HH','O']
-因此,如果适合,请告诉我

编辑:假设复合词使用由单个大写字母或单个大写字母后跟多个小写字母组成的元素,则可以添加以下内容:

final = re.findall('[A-Z][a-z]*', ''.join(expand))
它将返回列表中每个元素作为单独的条目,例如
['H','H','O']

编辑2:根据我之前的编辑假设,我们实际上可以将整个内容缩减为几行:

name = raw_input("Insert the name of a molecule/atom to find its RMM/RAM: ")
test = re.findall('([A-z][a-z]*)(\d*)', name)
final = re.findall('[A-Z][a-z]*', ''.join([a*int(b) if len(b) > 0 else a for (a, b) in test]))

使用正则表达式和生成器函数:

import re

def multilpy_string(seq):
    regex = re.compile("([a-zA-Z][0-9])|([a-zA-Z])")
    for alnum, alpha in regex.findall(''.join(seq)):
        if alnum:
            for char in alnum[0] * int(alnum[1]):
                yield char
        else:
            yield alpha

l = ['C', 'O', '2'] # ['C', 'O', 'O']
print(list(multilpy_string(l)))
我们使用
''重新加入您的列表。加入
。然后我们编译一个正则表达式模式,它匹配列表中的两种类型的字符串。如果字符串是一个字母,后跟一个数字,则将其放入一个组中。如果是单个数字,则将其放入自己的组中。然后我们迭代每个组。如果我们在一个组中发现了一些东西,我们将生成正确的值。

在python3(我不知道python2)中,您可以简单地将字符串相乘

例如:

When name = H2O
Compound = ['', 'H2', 'O']
r = ['H', '2', 'O']
print("H"*2) # HH
print(2*"H") # HH
In [2]: def findElements(molecule):
    ...:      groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', molecule)]
    ...:      return [c for cG in groups for c in cG]

In [3]: findElements("H2O5S7D")
Out[3]: ['H', 'H', 'O', 'O', 'O', 'O', 'O', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'D']
证明此信息有用的证据:

r = ['H', '2', 'O']
replacements = [(index, int(ch)) for index, ch in enumerate(r) if ch.isdigit()]

for postion, times in replacements:
    r[postion] = (times - 1) * r[postion - 1]

# flaten the result
r = [ch for s in r for ch in s]

print(r) # ['H', 'H', 'O']

以下是一些嵌套的理解方法,可分为两行:

In [1]: groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', 'H2O')]

In[2]: [c for cG in groups for c in cG]
Out[2]: ['H', 'H', 'O']
注意:我正在解构和重建字符串,所以这可能不是最有效的方法

下面是一个较长的示例:

When name = H2O
Compound = ['', 'H2', 'O']
r = ['H', '2', 'O']
print("H"*2) # HH
print(2*"H") # HH
In [2]: def findElements(molecule):
    ...:      groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', molecule)]
    ...:      return [c for cG in groups for c in cG]

In [3]: findElements("H2O5S7D")
Out[3]: ['H', 'H', 'O', 'O', 'O', 'O', 'O', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'D']

化合物[x]!='0'
检查是多余的。同样,对于错误的输入,
final.append(compund[x-1])
将引发异常。你是对的。已更改为x!=0-这应该也消除了错误的输入可能性。您可以始终使用类似于
[char for charGroup in['HH',O']for charGroup in['HH',O']之类的方法将结果列表展平,以输出
['H',H',O']
这并不能完全回答问题。你可能想再读一遍,以便更好地理解Gad的要求。哇,在我的帖子发表后不到30秒内,投了反对票。你快速的判断力给我留下了深刻的印象;-)这不是一个直接的答案,但在我的选择中是有用的(这应该出现在新行中的同一条评论中-但按enter键将其发布,而不是新行,对此表示抱歉)请不要采取错误的方式:)我想你只是误解了这个问题。而且,正如我在上一篇评论中所说的那样,再仔细阅读一下这个问题,看看你错在哪里了。干杯否决票是匿名的,所以你无法确定谁否决了你的答案。但我要说,这次我否决了你的答案。我认为,有时澄清你为什么投票反对某些东西是很重要的。你假设元素完全由大写字母组成,并且(我认为)正在使用Python 3。是的,只有大写字母,但快速的
[a-Z][a-Z]?
可以解决这个问题。我会更新,但你的答案无论如何都是优秀的(将组解包为元组,而不是我的头/尾匹配)。