将列表中的单词乘以列表中的单词

时间:2016-11-17 16:31:06

标签: 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)

例如:

When name = H2O
Compound = ['', 'H2', 'O']
r = ['H', '2', 'O']

我想将H乘以2得到一个值“['H','H','O']。”

TLDR:我希望列表中的名称后面的整数打印先前列出的对象'x'次数(例如[O,2] =&gt; OO,[C,O,2] =&gt; COO)< / p>

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

5 个答案:

答案 0 :(得分:3)

定义compound之后,以下内容如何:

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]))

答案 1 :(得分:2)

你可以做点像......

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])

答案 2 :(得分:1)

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

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)))

我们使用''.join将您的列表重新加入。然后我们编译一个正则表达式模式,匹配列表中的两种类型的字符串。如果字符串是一个字母,后跟一个数字,则将其放入一个组中。如果它是一个单一的数字,它就放在自己的组中。然后我们遍历每个组。如果我们在组中找到了某些东西,我们就会产生正确的值。

答案 3 :(得分:1)

以下是一些嵌套的理解,以便用两行完成:

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']

注意:我正在解构和重构字符串,所以这可能不是最有效的方法。

这是一个较长的例子:

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']

答案 4 :(得分:-1)

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

例如:

mpirun -np 2 ./test
(0) start                                              MEM: 53068 KB.  MIN: 26528 MAX: 26540 AVG: 26534 Change: 0 KB
(0) end                                                MEM: 53300 KB.  MIN: 26632 MAX: 26668 AVG: 26650 Change: 232 KB

证明此信息有用:

print("H"*2) # HH
print(2*"H") # HH