Помогите пожалуйста разобраться с решением следующей задачи

Напишите программу, которая считывает список чисел lst из первой строки и число x из второй строки, которая выводит все позиции, на которых встречается число x в переданном списке lst.

Позиции нумеруются с нуля, если число x не встречается в списке, вывести строку "Отсутствует" (без кавычек, с большой буквы).

Позиции должны быть выведены в одну строку, по возрастанию абсолютного значения.

Написал такое решение:

a = [int(i) for i in input().split(' ')]
x = int(input())
pos = 0
for i in range(len(a)):
    print(a.index(x,pos), end=' ')
    pos = a.index(x,pos) + 1

Программа выдает правильный ответ, однако тут же выдает:

Traceback (most recent call last):  
File "*путь*", line 45, in \<module\>  
  print(a.index(x,pos), end=' ')  
ValueError: 3 is not in list"

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


Ответы (4 шт):

Автор решения: n1tr0xs

Дело в том, что если метод index не находит указанный элемент в последовательности, то выкидывается ValueError, вам нужно всего лишь ее отловить так:

a = [int(i) for i in input().split(' ')]
x = int(input())
pos = 0
for i in range(len(a)):
    try:
        print(a.index(x,pos), end=' ')
    except ValueError:
        break # завершаем цикл, так как дальше в списке искомого нет
    else:
        pos = a.index(x,pos) + 1
→ Ссылка
Автор решения: CrazyElf

Не устану повторять, что такие задачи лучше всего решать с помощью списочного включения и функции enumerate. Примерно так:

a = [int(i) for i in input().split(' ')]
x = int(input())
pos_list = [i for i,el in enumerate(a) if el == x]
if pos_list:
    print(' '.join(map(str, pos_list)))
else:
    print("Отсутствует")
→ Ссылка
Автор решения: MBo

Зачем нужно искать индекс, если достаточно просто обойти список?

a = [int(i) for i in input().split(' ')]
x = int(input()) 
found = False   
for i in range(len(a)):
    if x == a[i]:
        print(i, end=' ')
        found = True 
if not found:
        print("нету")
→ Ссылка
Автор решения: MarianD
lst = [int(i) for i in input().split()]
x = int(input()) 

indices = [pos for pos, num in enumerate(lst) if num == x]

if indices:
    for i in indices:
        print(i, end=' ')
else:
    print("Отсутствует")

Объяснение:

В выражении — генераторе списка (я добавил ненужные пробелы и скобки)

[pos        for (pos, num) in enumerate(lst)         if num == x]
  1. Первая часть — pos — значит элемент, который будет добавляться в список,
  2. Вторая часть — for (pos, num) in enumerate(lst) — значит, что будем проходить все пары (кортежи) типа (позиция_элемента, элемент) из пронумерованного (enumerate) списка lst.
  3. Третья часть — if num == x — значит, что не будем добавлять элементы pos из всех парей (pos, num) пункта 2, но только из таких, которые удовлетворяют условию
    num == x.
→ Ссылка