2017-07-03 24 views
2

我正在尝试使用python 2.7制作分子量计算器。我目前的程序是通过要求用户输入一个化学式,例如“C 6 H 12 O 6”。
然后,程序将输入变成一个列表,然后将这些数字与字符分开。为此,将用户列表与元素列表进行比较。
如果一个字符与一个元素匹配,程序会将该元素附加到一个单独的列表中。但是,由于某些原因,24个(最初为49个)元素不被识别为在元素列表中,因此不会被添加到新列表中。
例如,程序不会将“Mg”或“Al”添加到新列表中。通过将我的列表和输入转换为大写的upper(),我将无法识别的元素列表从49减少到24。
然而,24个元素仍然没有得到承认。以下是我认为是问题的代码。Python不识别列表中的所有元素

reflistchar = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne','Na', 'Mg'] 
#A separate loop converts each element to uppercase. Shortened for simplicity. 

s1 = raw_input('Formula: ') 
s = s1.upper() 
slist = s.split(' ') 

x = len(slist) 
y = 0 
for i in range(x): 
if any(i in reflistchar for i in slist[y]): 
    slchar.append(slist[y]) 
y += 1 

例如:

输入:

element1 element2 element3 element4 element5 

预期输出:

[element1, element2, element3, element4, element5] 

电流输出:

[element2, element3, element5] 

正如我试图在上面显示的那样,用户输入了5个元素,但只有一些元素被添加到列表中。没有添加的元素不会被添加,不管它们输入什么顺序。
我认为这可能是因为这些元素表示某种类型的python函数或变量。我非常感谢关于如何让程序识别它们的任何建议。

+0

你的'any'正在检查'slist [y]'的任何*个体字符*是否在'reflistchar'中,而不是实际的列表元素是否在'reflistchar'中。 – user2357112

+0

另外,你有点错过了'for'循环的重点,使用单独的'y'计数器和未使用的'i'。 – user2357112

+0

您也将输入转换为大写,而您的列表包含混合大小写元素。 –

回答

3

一对夫妇的指针...

首先,s.split()s.split(' ')一个更好的选择,因为它处理多个空格更好。

接下来,您正在遍历一个循环,但不使用任何地方的i。但这不是主要问题。

第三,主要的问题,是这样的:

any(i in reflistchar for i in slist[y]) 

slist[y]字符串。例如,如果slist[y]包含'Al',则首先检查'A'中的reflistchar,然后检查'l'中的reflistchar ...因为您也可以迭代字符串!这就是为什么你没有得到你想要的东西。您应该使用in运算符来检查是否存在。

这是你的代码的固定版本:

reflistchar = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne','Na', 'Mg'] 
string_list = raw_input('Formula: ').upper().split() 

reflistchar = set(reflistchar) 

elements = [] 
for e in string_list: 
    if e in reflistchar: 
     elements.append(e) 

奖金!我将reflistchar转换为set,以获得快速,恒定的O(1)查找。

相关问题