列表超出索引-Python,但不应

时间:2018-10-31 04:25:18

标签: python list

我正在阅读讲义,并重做教授在课堂上做的一个例子。但是我继续从索引错误中获取列表。任何帮助或解释都将很好。我试图阅读它,但不理解,因此将其发布在这里,希望有人可以向我解释。

这就是我所做的:

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:列表索引超出范围。

2 个答案:

答案 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[:]