1

我已经编写了这个 python 代码。当我运行它时,最后会出现索引错误;我不知道为什么。我想知道是否有人可以帮助我。

问题是找到能被 1 到 20 的所有数字整除的最小正数。我的分析是正确的,但只是最后的代码让我很难过。

def leastCommonDenominator(num1, num2):
    '''
        Returns the least common denominator of two numbers
    '''
    num2List = range(1,num2+1)
    if num1 < num2:
        for i in num2List:
            if (num1*num2List[i]) % num2 == 0:
                return num1*num2List[i]
    num1List = range(1, num1+1)
    if num2 < num1:
        for i in num1List:
            if (num2*num1List[i]) % num1 == 0:
                return num2*num1List[i]
    else:
        return num1

def leastNum():
    '''
        Prints the least number divisible
    '''
    myList = range(1,4)
    print myList
    num = 1
    for i in myList:
        num = leastCommonDenominator(num, myList[i])
        print num    

def main():
    leastNum()
4

2 回答 2

2

利用

for i in myList:
    num = leastCommonDenominator(num,i)
    print num

代替

for i in myList:
    num = leastCommonDenominator(num,myList[i])
    print num

这里 i 是列表元素的迭代器。它不是元素的索引。所以你不能使用 myList[i]。另一方面,你可以写

for i in range(0,len(myList)):
    num=leastCommonDenominator(num,myList[i])
于 2012-11-01T06:20:03.727 回答
2

当您定义 时myList,它的值是(如您所知):

myList = [1, 2, 3]

当您迭代时,您正在循环遍历每个元素(1、2、3),但是当您调用 时leastCommonDenominator,您使用的是列表的索引,而不是元素本身(即在第一次通过时,您不是调用 的第一个元素myList,您正在调用myList[1],这是第二个元素。这会导致IndexError最后一次传递,因为myList[3]它引用列表中的第四个元素,正如我们所见,它不存在(因为range不包括其值的上限)。为了修复,您应该能够这样做:

num = leastCommonDenominator(num, i)

当您for像以前一样使用循环时,您可以简单地使用值本身。如果你想引用元素的位置,你可以使用enumerate,它返回一个值的索引/位置和值本身(这更仅供参考 - 你不需要它我不相信 :) )。例如:

for index, i in enumerate(myList):
    num = leastCommonDenominator(num, myList[index])

你会得到同样的结果。

于 2012-11-01T05:37:26.747 回答