Не работает программа, которая вычисляет кол-во различных объектов в списке

Прохожу сейчас курс на степике по питону, и в одном из степов попалась задача:

Реализуйте программу, которая будет вычислять количество различных объектов в списке. Два объекта a и b считаются различными, если a is b равно False.

Вашей программе доступна переменная с названием objects, которая ссылается на список, содержащий не более 100 объектов. Выведите количество различных объектов в этом списке. Рассмотрим пример:

objects = [1, 2, 1, 2, 3] # будем считать, что одинаковые числа соответствуют одинаковым объектам, а различные – различным

Тогда все различные объекты являют собой множество {1, 2, 3} . Таким образом, количество различных объектов равно трём.

Я написал программу, которая не работает:

n = len(objects) 
count = 0 
for i in range(n):
    for j in range(i+1, n):
        if id(objects[i]) == id(objects[j]):
            count += 1 # считаю кол-во повторяющихся(по id) элементов 
print(n - count) #отнимаю это кол-во от общего числа

В самом степе есть решение:

n = len(objects)
ans = n
for i in range(n):
    for j in range(i):
        if id(objects[i]) == id(objects[j]):
            ans -= 1
            break

print(ans)

Я проверил свою на следующих примерах:

objects = [1, 2, 1, 2, 3]

objects = [1, 2, 1, 5, True, False, True, 'false', [], [1,2], [1,2]]

И она выдает те же рез-ты, что и правильная, но тест не проходит. Вот хотел узнать почему? Потому что, как мне кажется, моя делает то же самое(подсчет повторов в списке) только направления движения второго цикла разные. Если кто-то понял, почему моя программа не решает задачу, объясните пожалуйста почему или хотя бы предложите начальные данные, на которых она выдаст неправильный результат. Заранее спасибо.


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

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

По сути вопроса вам уже объяснили в комментариях (дело в волшебном break), но я помимо этого хочу сделать пару примечаний.

  1. Странно, что вы в явном виде используете id, хотя в задании прямо сказано использовать "синтаксический сахар" is (который проверяет именно равенство id). Т.е. вместо:
id(objects[i]) == id(objects[j])

Должно быть:

objects[i] is objects[j]
  1. А если уж использовать id, то можно решить эту задачу гораздо проще и короче. Хотя, возможно, вы ещё не проходили set и map:
print(len(set(map(id, objects))))
→ Ссылка