我正在阅读讲义,并重做教授在课堂上做的一个例子。但是我继续从索引错误中获取列表。任何帮助或解释都将很好。我试图阅读它,但不理解,因此将其发布在这里,希望有人可以向我解释。
这就是我所做的:
def sortList(list1):
sorted = []
while len(list1)> 0:
lowest = list1[0]
for value in list1:
#we need to place the items in order so first we will find the lowest value
if value < lowest:
lowest = value
#lowest is the smallest number in list1
# now we can add it to the sorted list
sorted.append(lowest)
#we can remove the item from list one
list1.remove(lowest)
return sorted
def median(list1):
list1 = sortList(list1)
#list one is now in sorted order
while len(list1)> 2: # we are trying to take out all the numbers till 2 left (if 3 left it will execute and leave 1)
list1.pop(0) #takes out the first item in the list
list1.pop() #takes out the last item in the list
if len(list1) == 1: # if there is only one item we return it
return list1[0]
else: #returns the avg of those
return((list1[0] + list1[1])/2)
x = [45, -1, 0, 54, 101, 2, 7,11]
print(sortList(x))
print(median(x))
但是我什么时候
print(sortList([45, -1, 0, 54, 101, 2, 7,11]))
print(median([45, -1, 0, 54, 101, 2, 7,11]))
它可以正常打印。这是为什么?
这是错误消息: print(median(x))... return((list1 [0] + list1 [1])/ 2) IndexError:列表索引超出范围。
答案 0 :(得分:0)
原因是因为using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
int[] arr = {999999999, 999999999, 999999999,999999999, 999999999};
long sum = 0;
for (int i = 0; i < arr.Length; i += 1)
{
sum += arr[i];
}
Console.WriteLine(sum);
}
}
在x
语句中调用的sortList
函数中已被修改。如果选中,该语句后的x值为print(sortList(x))
。因此,将一个空列表插入到[]
函数中,这会在执行median
时导致索引不足错误(因为空列表的长度为0且0!= 1)
return((list1[0] + list1[1])/2)
和print(sortList([45, -1, 0, 54, 101, 2, 7,11]))
之所以有效,是因为print(median([45, -1, 0, 54, 101, 2, 7,11]))
函数没有获得空列表作为输入。
另一个原因也是因为您要从median
函数返回排序后的列表,但没有将其存储回x中。所以,这应该工作
sortList
答案 1 :(得分:0)
这是因为您实现了sortList()方法。在该方法中, x 和 list1 引用了同一列表,并且在方法列表的末尾从 list1 中删除元素时x 变为空列表。因此,当您尝试从空列表((list1[0] + list1[1])/2)
访问元素时,它将为您提供索引错误。
您可以逐行显示http://www.pythontutor.com/visualize.html#mode=edit的代码执行情况
解决方案:将list1复制到sortList()的新列表中。您可以使用new_list = old_list.copy()
或new_list = old_list[:]