Убрать повторы, сохранив порядок
list(set(spisok)) убирает дубликаты и рушит порядок — что делать вместо.
Самый короткий способ и его цена
list(set(["б", "а", "б"])) # порядок непредсказуем
Множество не хранит порядка вовсе. Ответ может оказаться любым, и — что хуже — на маленьких данных он часто выглядит правильным.
Как надо
Два набора: множество помнит увиденное, список собирает ответ.
vidennye = set()
itog = []
for znachenie in spisok:
if znachenie not in vidennye:
vidennye.add(znachenie)
itog.append(znachenie)
Короткая запись
Словарь порядок помнит, и этим пользуются:
list(dict.fromkeys(spisok))
Одна строка, тот же результат. В работе пишут обычно так.
Почему всё-таки стоит знать длинный вариант
Он работает там, где «уже было» считается не по самому значению:
vidennye = set()
itog = []
for tovar in tovary:
if tovar["артикул"] not in vidennye: # сравниваем по артикулу
vidennye.add(tovar["артикул"])
itog.append(tovar) # кладём весь товар
dict.fromkeys так не умеет.
Почему множество, а не список
znachenie not in spisok просматривает список целиком. На тысяче
значений это миллион сравнений, на десяти тысячах — сто миллионов.
Проверка по множеству занимает одинаковое время независимо от
размера.
Это самая дешёвая оптимизация в Python: поменять список на множество там, где по нему только ищут.