Список вне индекса - Python, но это не должно быть - PullRequest
0 голосов
/ 31 октября 2018

Я просматривал свои лекционные заметки и переделывал пример, который профессор делал в классе. Но я продолжаю получать список ошибок индекса. Любая помощь или объяснение было бы здорово. Я попытался прочитать об этом, но не понял этого, поэтому размещаю его здесь, надеясь, что кто-то сможет мне это объяснить.

Вот что я сделал:

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 (медиана (x)) ... return ((list1 [0] + list1 [1]) / 2) IndexError: список индексов вне диапазона.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Это из-за вашей реализации метода 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[:]

0 голосов
/ 31 октября 2018

Причина в том, что x был изменен в функции sortList, вызываемой в операторе print(sortList(x)). Если вы проверите, значение x после этого оператора будет []. Таким образом, пустой список вставляется в функцию median, что приводит к ошибке из-за отсутствия индекса при выполнении return((list1[0] + list1[1])/2) (поскольку длина пустого списка равна 0 и 0! = 1)

print(sortList([45, -1, 0, 54, 101, 2, 7,11])) и print(median([45, -1, 0, 54, 101, 2, 7,11])) работают, потому что функция median не получила пустой список в качестве ввода.

Другая причина также в том, что вы возвращаете отсортированный список из функции sortList, но не сохраняете его обратно в x. Итак, это должно работать

x = [45, -1, 0, 54, 101, 2, 7,11]
x = sortList(x)

print(x)
print(median(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...