尝试迭代列表时出现索引错误

问题描述 投票:0回答:1

我刚刚完成在线哈佛 CS50P 课程,对于我的第一个项目,我正在尝试开发一个计算多项式函数 y 值的程序。我知道我的代码可能经过了非常优化,并且有一个库已经完成了我正在做的事情,但这并不是我真正关注的重点。我正在尝试做一些无论如何都有效的事情。

import math

equation = input("Equation: ").strip().lower().replace(" ", "")
value = input("Value of x: ")

chars = []
exponents = []
mults = []
sums = []
subs = []
divs = []
sqrts = []

result = 0

for char in equation:
    if char == "x":
        char = char.replace("x", value)
        chars.append(char)
    else: 
        chars.append(char)

for op in range(len(chars)):
    if chars[op] == "^":
        exponents.append(1)
    elif chars[op] == "*":
        mults.append(op)
    elif chars[op] == "+":
        sums.append(op)
    elif chars[op] == "-":
        subs.append(op)
    elif chars[op] == "/":
        divs.append(op)
    elif chars[op] == "v":
        sqrts.append(op)
        
for exponent in range(len(exponents)):
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
    chars[exponents[exponent] - 1] = expResult
    chars.remove(chars[exponents[exponent]])
    chars.remove(chars[exponents[exponent]])
    exponents.remove(1)
    result += float(expResult)
    
for sqrt in range(len(sqrts)):
    sqrtResult = int(chars[sqrts[sqrt] - 1]) * math.sqrt(int(chars[sqrts[sqrt] + 1]))
    chars[sqrts[sqrt] - 1] = sqrtResult
    chars.remove(chars[sqrts[sqrt]])
    chars.remove(chars[sqrts[sqrt]])
    result += float(sqrtResult)

for mult in range(len(mults)):
    multResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
    chars[mults[mult] - 1] = multResult
    chars.remove(chars[mults[mult]])
    chars.remove(chars[mults[mult]])
    result += float(multResult)
    
for div in range(len(divs)):
    divResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
    chars[divs[div] - 1] = divResult
    chars.remove(chars[divs[div]])
    chars.remove(chars[divs[div]])
    result += float(divResult)
    
print(result)
print(chars)
print(exponents)

我仍处于开发它的第一步。然而,每当我输入一个具有超过 1 个操作的函数时,我都会得到

IndexError: list index out of range

所以,例如:

Equation: x^3^3
Value of x: 2
Traceback (most recent call last):
  File "/Users/vinisiqueira/graphingCalc/graphingCalc.py", line 38, in <module>
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
                          ~~~~~~~~~^^^^^^^^^^
IndexError: list index out of range

当我将 for 循环更改为仅迭代一次时,我得到:

Equation: 2^3^2
Value of x: 2
8.0
[8, '^', '2']
[1]

所以这意味着对于第一个操作,它可以工作,但是当再次执行完全相同的操作时会失败。

如果这段代码不清楚,我对此感到非常抱歉,但如果有任何帮助,我们将不胜感激。

谢谢你

python list loops for-loop
1个回答
0
投票

我们来剖析一下吧

for exponent in range(len(exponents)):
expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])

我想通过一个简单的替换来缩短它

我会写 i 来代替指数

目前我们可以将其设置为 ** int(chars[exponents[exponent] + 1]) 部分,因此我不会编写它,因为它不会导致我们这里的错误。

   for i in range(len(exponents)):
      expResult = int(chars[exponents[i] - 1]) 

“列表索引超出范围”表示您的 exponents[i]-1 值很可能会产生比 len(chars) 更大的值

要测试此功能,请运行

for exponent in range(len(exponents)):
    print(f" length of char list is  {len(chars)}" )
    print(f" current exponent value is   {exponents[exponent]} ")
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])

当您当前的指数值超过字符列表的长度时,您可以看到代码失败的原因

© www.soinside.com 2019 - 2024. All rights reserved.