Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表分割并存储要在变量中使用的字符串_Python_List - Fatal编程技术网

Python 使用列表分割并存储要在变量中使用的字符串

Python 使用列表分割并存储要在变量中使用的字符串,python,list,Python,List,在a中,有人建议,为了分割字符串并存储它,我应该使用一个列表,如下所示: [a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a] ['Mg', u'S', u'O', u'4'] formula = raw_input("Enter formula: ") 这一次我想问的是,如果可能的话,我将如何使用它将创建的不同字符串存储到变量中,以便在我拥有的CSV文件中查找它们。其中“MgSO4”来自一个名为“公式”的变量,该变量由原始输入产生,如下

在a中,有人建议,为了分割字符串并存储它,我应该使用一个列表,如下所示:

[a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]
['Mg', u'S', u'O', u'4']
formula = raw_input("Enter formula: ")
这一次我想问的是,如果可能的话,我将如何使用它将创建的不同字符串存储到变量中,以便在我拥有的CSV文件中查找它们。其中“MgSO4”来自一个名为“公式”的变量,该变量由原始输入产生,如下所示:

[a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]
['Mg', u'S', u'O', u'4']
formula = raw_input("Enter formula: ")
完整的程序代码可以找到,我已经包括了下面更相关的部分。提前感谢您的帮助

formula = raw_input("Enter formula: ")


[a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]

weight_sum = sum(float(formul_data.get(elem.lower())) for elem in elements)
print "Total weight =", weightSum
跑步后

>>> import re
>>> elements = [a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]
可以使用索引访问分割的零件

>>> print elements[0]
'Mg'
>>> print elements[-1]  # print the last element
'4'
跑步后

>>> import re
>>> elements = [a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]
可以使用索引访问分割的零件

>>> print elements[0]
'Mg'
>>> print elements[-1]  # print the last element
'4'

这只是一个猜测,但可能是您没有意识到re.split代码可以应用于任何字符串,包括从原始输入读取的字符串。这就是你想要的吗

formula = raw_input("Enter formula: ")

elements = [a for a in re.split(r'([A-Z][a-z]*)', formula) if a]

weight_sum = sum(float(formul_data.get(elem.lower(), 0)) for elem in elements)
print "Total weight =", weight_sum

这只是一个猜测,但可能是您没有意识到re.split代码可以应用于任何字符串,包括从原始输入读取的字符串。这就是你想要的吗

formula = raw_input("Enter formula: ")

elements = [a for a in re.split(r'([A-Z][a-z]*)', formula) if a]

weight_sum = sum(float(formul_data.get(elem.lower(), 0)) for elem in elements)
print "Total weight =", weight_sum

如果你的目标是能够把组成一个分子的原子的分子量相加,我建议你的正则表达式做得稍微不同一点。不要让数字与拆分列表中的元素符号混合在一起,而是将它们附加到前面的元素,如果没有数字,则附加1。我是这样做的:

import re

# a partial table of atomic weights, replace with something better!
weights = { "H" : 1,  "Na": 11, "Mg": 12, "C" : 12, "N" : 14,
            "O" : 16, "F" : 19, "Al": 27, "S" : 32, "Cl": 35, 
      }

def molecularWeight(formula):
    matches = re.findall(r"([A-Z][a-z]?)([0-9]*)", formula)
    return sum(weights[symbol] * (int(count) if count else 1)
               for (symbol, count) in matches)
要使其与您所展示的代码相匹配,请将权重[symbol]替换为类似于formul_data.getsymbol.lower、0或任何必要的内容,以便通过代码中的符号获得适当的原子量


这应该处理任何经验公式,以及许多结构性公式,只要没有括号。要解决完全括号内的公式,您需要制作一个更好的解析器,因为简单的正则表达式不起作用。

如果您的目标是能够将组成一个分子的原子的分子量相加,我建议您使用稍微不同的正则表达式。不要让数字与拆分列表中的元素符号混合在一起,而是将它们附加到前面的元素,如果没有数字,则附加1。我是这样做的:

import re

# a partial table of atomic weights, replace with something better!
weights = { "H" : 1,  "Na": 11, "Mg": 12, "C" : 12, "N" : 14,
            "O" : 16, "F" : 19, "Al": 27, "S" : 32, "Cl": 35, 
      }

def molecularWeight(formula):
    matches = re.findall(r"([A-Z][a-z]?)([0-9]*)", formula)
    return sum(weights[symbol] * (int(count) if count else 1)
               for (symbol, count) in matches)
要使其与您所展示的代码相匹配,请将权重[symbol]替换为类似于formul_data.getsymbol.lower、0或任何必要的内容,以便通过代码中的符号获得适当的原子量


这应该处理任何经验公式,以及许多结构性公式,只要没有括号。要解决完全带括号的公式,您需要制作一个更好的解析器,因为简单的正则表达式不起作用。

在CSV文件中查找它们后,您想做什么?从您的示例来看,似乎您已经在使用formul_data.getelem.lower查找它们。另外,我假设您希望在该行的前面有一个elements=,并带有re.split list comprehension?我希望找到给定元素的权重,然后将它们相加。我程序顶部的代码从我拥有的两个CSV文件中提取数据,以便执行此操作。是的,我想我需要元素=在那里。我的首选解决方案是采用某种方法,将元素放入变量中,然后查找这些元素,但这主要是因为这是我知道的唯一方法。任何其他方式我都有点狡猾,所以需要一点解释。也许我没有正确地阅读你的pastebin中的代码,但在我看来,它像是weight_sum=。。。您发布的行确实添加了权重。什么是你不需要它做的?啊,对不起,连我现在都开始感到困惑了。我想我这里唯一的问题是似乎出现的类型错误:我输入了HCO作为输入,如果这有区别的话。一旦你在CSV文件中查找它们,你想做什么?从您的示例来看,似乎您已经在使用formul_data.getelem.lower查找它们。另外,我假设您希望在该行的前面有一个elements=,并带有re.split list comprehension?我希望找到给定元素的权重,然后将它们相加。我程序顶部的代码从我拥有的两个CSV文件中提取数据,以便执行此操作。是的,我想我需要元素=在那里。我的首选解决方案是采用某种方法,将元素放入变量中,然后查找这些元素,但这主要是因为这是我知道的唯一方法。任何其他方式我都有点狡猾,所以需要一点解释。也许我没有正确地阅读你的pastebin中的代码,但在我看来,它像是weight_sum=。。。您发布的行确实添加了权重。什么是你不需要它做的?啊,对不起,连我现在都开始感到困惑了。我想我唯一的问题是出现的打字错误:我输入了HCO作为输入,如果这有区别的话
脚踝疼得厉害!但是,我有没有办法解释公式长度的差异?例如,CH3COOH而不是MgSO4。这太棒了,非常感谢!但是,我有没有办法解释公式长度的差异?例如,CH3COOH而不是MgSO4。是的,我现在完成了。唯一的问题是打字错误看看我的question@dantdj:请参阅我编辑的答案注释添加的零。问题是,在解析公式时,你也会得到像MgSO4中的4这样的数字,而不仅仅是元素名称。使用它可以清除任何错误,但是我没有正确地添加权重:这行中一定有一些不可靠的东西weightSum=sumfloatformul_data.getelem.lower,0表示元素中的元素,但我不太确定它是什么。也许使用元素而不是元素?好吧,再一次,你超越了你原来的问题。您询问如何将字符串拆分为元素。已经完成了,但这不会自动导致O在MgSO4中被计数4次。目前,您正在忽略计算中的4。如果您想考虑它,您需要做的不仅仅是解析元素名。您还必须解析这些数字,并将相应的元素乘以它们的计数。不,我这里不使用MgSO4作为输入,在本例中仅使用HCO。公式中没有任何数字。虽然,是的,即使这样也可能被视为超出了我最初问题的范围,这并不太遥远,我不想把网站弄得比我在关于一个非常相似的主题的多个帖子中所做的还要混乱,特别是考虑到这个问题可能仅限于一行。是的,我现在已经做到了。唯一的问题是打字错误看看我的question@dantdj:请参阅我编辑的答案注释添加的零。问题是,在解析公式时,你也会得到像MgSO4中的4这样的数字,而不仅仅是元素名称。使用它可以清除任何错误,但是我没有正确地添加权重:这行中一定有一些不可靠的东西weightSum=sumfloatformul_data.getelem.lower,0表示元素中的元素,但我不太确定它是什么。也许使用元素而不是元素?好吧,再一次,你超越了你原来的问题。您询问如何将字符串拆分为元素。已经完成了,但这不会自动导致O在MgSO4中被计数4次。目前,您正在忽略计算中的4。如果您想考虑它,您需要做的不仅仅是解析元素名。您还必须解析这些数字,并将相应的元素乘以它们的计数。不,我这里不使用MgSO4作为输入,在本例中仅使用HCO。公式中没有任何数字。虽然,是的,即使这样也可能被视为超出了我最初问题的范围,这也不算太远,我不想把网站弄得比我在关于一个非常类似主题的多篇帖子中做的更混乱,特别是考虑到这个问题可能仅限于一行。用从CSV导入的数据替换权重列表是否可行?把所有这些数据放进.py文件会非常混乱。@dantdj:是的,绝对是这样。我这样做只是为了快速测试一些东西。用CSV导入的数据替换权重列表是否可行?把所有这些数据放进.py文件会非常混乱。@dantdj:是的,绝对是这样。我这么做只是为了能快速测试一些东西。