Помогите пожалуйста разобраться с решением следующей задачи
Напишите программу, которая считывает список чисел
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 шт):
Дело в том, что если метод 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
Не устану повторять, что такие задачи лучше всего решать с помощью списочного включения и функции 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("Отсутствует")
Зачем нужно искать индекс, если достаточно просто обойти список?
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("нету")
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]
- Первая часть —
pos— значит элемент, который будет добавляться в список, - Вторая часть —
for (pos, num) in enumerate(lst)— значит, что будем проходить все пары (кортежи) типа (позиция_элемента, элемент) из пронумерованного (enumerate) спискаlst. - Третья часть —
if num == x— значит, что не будем добавлять элементыposиз всех парей(pos, num)пункта 2, но только из таких, которые удовлетворяют условию
num == x.