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

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函数或变量。我非常感谢有关如何使程序识别它们的任何建议。

最佳答案

几个指针...

首先,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)查找。

关于python - Python无法识别列表的所有元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44894199/

10-09 16:07
查看更多