Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2018 22:32:36

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

Всем здравствуйте!

Помогите, пож-та, разобраться почему возникает ошибка.

Пытаюсь решить след. задачу:

Напишите программу, которая принимает на вход список чисел в одной строке и выводит на экран в одну строку значения, которые повторяются в нём более одного раза.
Для решения задачи может пригодиться метод sort списка.
Выводимые числа не должны повторяться, порядок их вывода может быть произвольным.

Вот мое решение:

a =
a.sort()
dlina = len(a) - 1
i = 0
while i < dlina:
if a == a:
print(a, end=“ ”)
i += 1
while a == a and i < dlina:
i += 1
if a != a:
i += 1


При проверке возникает ошибка:

while a == a and i < dlina:
IndexError: list index out of range


Подскажите пож-та, почему возникает эта ошибка? Ведь условие i < dlina в цикле while уже не допускает работы программы с номером элемента списка, выходящим за пределы его длины (начинающейся с нуля)

Офлайн

#2 Июнь 3, 2018 23:02:17

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

list index out of range

ничего не понятно. нахрена вы а с а сравниваете? while a == a?? какой в этом смысл?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Июнь 4, 2018 07:45:29

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

a =
a.sort()
dlina = len(a) - 1
i = 0
while i < dlina:
if a == a:
print(a, end=“ ”)
i += 1
while a == a and i < dlina:
i += 1
if a != a:
i += 1

Офлайн

#4 Июнь 4, 2018 07:51:30

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

Почему-то индексы исчезают…

прикрепил принт-скрин решения…

а вопрос тот же…

Прикреплённый файлы:
attachment 04.06.18.png (6,6 KБ)

Офлайн

#5 Июнь 4, 2018 07:53:39

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

a = [int(i) for i in input().split()]
a.sort()
dlina = len(a) - 1
i = 0
while i < dlina:
if a[i] == a[i + 1]:
print(a[i], end=" ")
i += 1
while a[i] == a[i + 1] and i < dlina:
i += 1
if a[i] != a[i + 1]:
i += 1


Офлайн

#6 Июнь 4, 2018 08:49:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

list index out of range

предположим что у вас всего два числа:

 dlina = len(a) - 1 = 1
i = 0
while i < 1: 
      if a[0] == a[1]: # тут все отработает
      i += 1 = 1
     while a[1] == a[2] and i < dlina: # но a[2] у нас нету так как всего два элементв в списке, вот и получаем ошибку.

Francisco
Подскажите пож-та, почему возникает эта ошибка? Ведь условие i < dlina в цикле while уже не допускает работы программы с номером элемента списка, выходящим за пределы его длины (начинающейся с нуля)
потому что пайтон проверяет устовия по порядку, сначала берет значение индексов списка, а потом если True то проверяет второе устовие i < dlina
исправляется банально, нужо поменять условия местами:
 while i < dlina and a[i] == a[i + 1] :
в таком случае если первое условие i < dlina будет False пайтон не будет проверять второе и прервет цикл.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 4, 2018 08:53:57)

Офлайн

#7 Июнь 4, 2018 12:33:11

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

PEHDOM
предположим что у вас всего два числа:

dlina = len(a) - 1 = 1
i = 0
while i < 1:
if a == a: # тут все отработает
i += 1 = 1
while a == a and i < dlina: # но a у нас нету так как всего два элементв в списке, вот и получаем ошибку.

Francisco
Подскажите пож-та, почему возникает эта ошибка? Ведь условие i < dlina в цикле while уже не допускает работы программы с номером элемента списка, выходящим за пределы его длины (начинающейся с нуля)
потому что пайтон проверяет устовия по порядку, сначала берет значение индексов списка, а потом если True то проверяет второе устовие i < dlina
исправляется банально, нужо поменять условия местами:
while i < dlina and a == a :
в таком случае если первое условие i < dlina будет False пайтон не будет проверять второе и прервет цикл.


Хорошо, это я исправил:

 a = [int(i) for i in input().split()]
a.sort()
dlina = len(a) - 1
i = 0
while i < dlina:
    if a[i] == a[i + 1]:
        print(a[i], end=" ")
        i += 1
        while i < dlina and a[i] == a[i + 1]:
            i += 1
    if a[i] != a[i + 1]:
        i += 1

Но все равно возникает ошибка уже в строке if a != a:. А в этой строке такой ошибки возникать не должно, т.к. первый цикл “while i < dlina:” не должен ее допустить. Т.е. когда число i достигнет последнего элемента в списке, цикл должен будет прерваться. А пока не достигнет как раз будет минимальный запас в единицу…
Или я опять не так понимаю?

Офлайн

#8 Июнь 4, 2018 23:05:21

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

list index out of range

Francisco
Но все равно возникает ошибка уже в строке if a != a:. А в этой строке такой ошибки возникать не должно, т.к. первый цикл “while i < dlina:” не должен ее допустить.
должно, обратите внимение на отсуп, у вас
  if a[i] != a[i + 1]:
находиться вне цикла while i < dlina… Соотвевенно после прерывания while i < dlina… интерпретатор выполняет слудующую комманду if a(i) !=…. Условеи i < dlinа прерывает только тот цикл в котором оно вызываеться, а не все циклы.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 4, 2018 23:07:01)

Офлайн

#9 Июнь 5, 2018 03:07:41

Francisco
Зарегистрирован: 2018-04-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

list index out of range

PEHDOM
находиться вне цикла while i < dlina… Соотвевенно после прерывания while i < dlina… интерпретатор выполняет слудующую комманду if a(i) !=…. Условеи i < dlinа прерывает только тот цикл в котором оно вызываеться, а не все циклы.

Так вот в том то и дело, что оба условия if имеют одинаковый отступ и находятся в одном и том же цикле while (5-ая строка)

 a = [int(i) for i in input().split()]
a.sort()
dlina = len(a) - 1
i = 0
while i < dlina:
    if a[i] == a[i + 1]:
        print(a[i], end=" ")
        i += 1
        while i < dlina and a[i] == a[i + 1]:
            i += 1
    if a[i] != a[i + 1]:
        i += 1

Офлайн

#10 Июнь 5, 2018 07:41:11

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

list index out of range

Francisco
Так вот в том то и дело, что оба условия if имеют одинаковый отступ и находятся в одном и том же цикле while (5-ая строка)
а вы думаете оно постоянно мониторит состояние i и как тольоко так сразу? Условие i < dlina проверяеться только в начале каждой итерации цикла, а не на каждый чих.
тоесть пока виток цикла не завершиться оно не будет проверять меньше ли i длинны. как только он завершился, оно опять сравнивает, если меньше, запускает еще один виток, если нет то прерывает цикл.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 5, 2018 07:47:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version