我正在尝试使用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/