我正在用Python做一些挑战。
我有以下代码:
def SimpleSymbols(str):
letters = []
results = []
for i in range(len(str)):
if str[i] != '=' and str[i] != '+':
letters.append(str[i])
if str[i-1] == '+' and str[i+1] == '+':
results.append(str[i])
return len(letters) == len(results)
如果我检查print(SimpleSymbols('++d+===+c++=='))
一切顺利,但如果我检查print(SimpleSymbols('++d+===+c++==+a'))
我收到此错误:
Traceback(最近一次调用最后一次):文件“python”,第15行,in 在SimpleSymbols IndexError中输入文件“python”,第9行:string 指数超出范围
有人可以解释一下,为什么?
答案 0 :(得分:2)
你试图访问索引str[i+1]
,这是在最后一次迭代中超出界限...
如果必须使用它,请将循环限制为仅运行len(str)-1
。要处理这种情况:'++d+===+c++==+a'
您可以在循环后添加一个检查,以验证前一个元素不是+
(或将其添加到{循环中的{1}}条件。)
此外,将变量if
命名为python内置函数是不好的做法!
答案 1 :(得分:1)
因为当你到达str的最后一个字符并且它是一个字母时,str[i+1]
就不存在了。
您需要将条件放在try except
块中以避免这种情况发生。 (当except
被提出时,您必须决定在IndexError
中做什么)
def SimpleSymbols(str):
letters = []
results = []
for i in range(len(str)):
if str[i] != '=' and str[i] != '+':
letters.append(str[i])
try:
if str[i-1] == '+' and str[i+1] == '+':
results.append(str[i])
except IndexError:
do what needs to be done in this case.
return len(letters) == len(results)
答案 2 :(得分:1)
def SimpleSymbols(str):
letters = []
results = []
for i in range(len(str)):
if str[i] != '=' and str[i] != '+':
letters.append(str[i])
if i < len(str)-1 and str[i-1] == '+' and str[i+1] == '+':
results.append(str[i])
return len(letters) == len(results)
print SimpleSymbols("=+b+a")
以这种方式编写代码, 一切都会好的。
答案 3 :(得分:1)
您似乎在寻找既不是+
也不是=
的符号,并检查所有这些符号是否都被跟踪并且前面有+
。
第一个和最后一个符号是特殊情况,因为它们要么不在前面,要么后跟任何内容,因此,如果它们既不是+
也不是=
,那么你的函数应该返回False
。
因为,在python中,some_string[-1]
返回字符串的最后一个字符,如果第一个字符既不是+
也不是=
,则循环不会中断。甚至返回True
以获取c++
等输入。但是,对于最后一个字符,您的代码会引发预期的IndexError
。
你可以:
检查第一个或最后一个符号是否在('+', '=')
中并返回False
,如果它们不在+
之前或之后。然后你可以在内部字符串上运行你的循环:
def SimpleSymbols(symbols):
control = ('+', '=')
if symbols[0] not in control or symbols[-1] not in control:
return False
for last_index, symbol in enumerate(symbols[1:-1]):
next_index = last_index + 2
if letter not in control:
if symbols[last_index] != '+' or symbols[next_index] != '+':
# Found a letter that is not enclosed in two '+'
return False
return True
使用正则表达式来计算不在{{1}}中的符号和包含在两个('+', '=')
内的同一组中的符号的出现次数:
+