Убрать дубликаты из списка, проблема смешения типов данных
Решаю задачи на "Ok, Python!" И застрял на следующем задании: Дан список [1.0, 'ok', True, 'ok', 7, 1]. Удалите из него повторяющиеся элементы (в списке не должно остаться дублей). Выведите измененный список на экран. Будьте внимательны! Значения 1.0, True и 1 – это не дубли!
Всё никак не понимаю как его выполнить. У меня выходит либо [1.0, ok, 7], либо просто набор из данных
Я использовал несколько методов: Первый:
my_list = [1.0, 'ok', True, 'ok', 7, 1]
dublicate = list(dict.fromkeys(my_list))
Второй:
my_list = [1.0, 'ok', True, 'ok', 7, 1]
dublicate = set(my_list)
pustoi = []
for num in dublicate:
for sec in my_list:
if sec == num and type(sec) == type(num):
break
else:
pustoi.append(sec)
Третий:
my_list = [1.0, 'ok', True, 'ok', 7, 1]
dublicate = set(my_list)
Ответы (2 шт):
Например так:
my_list = [1.0, 'ok', True, 'ok', 7, 1]
used = []
no_duplicates = []
for elem in my_list:
if (elem, type(elem)) not in used:
used.append((elem, type(elem)))
no_duplicates.append(elem)
print(no_duplicates)
Вывод:
[1.0, 'ok', True, 7, 1]
Обяснение:
В переменной used
(«использованные») будем сохранять пары (элемент, тип_элемента)
, когда мы с элементом и его типом встретимся в списке my_list
впервые.
В том случае (и в никаком другом) такой элемент записываем в список no_duplicates
(«без дубликатов»).
Из списка сделайте множество пар значение/тип, поместите его в множество, извлеките пары из множества, сохраните значения в новый список:
source = [1.0, 'ok', True, 'ok', 7, 1]
unique = [v for v, _ in set((v, type(v)) for v in source)]
print(unique)
Если код выше вам трудно читать, вот похожая идея в виде цикла. pairs
- множество пар значение/тип, которые уже встречались раньше. Пара попадает в результат, только если это новая пара. Порядок значений исходного списка сохраняется:
source = [1.0, 'ok', True, 'ok', 7, 1]
pairs = set() # (v, type(v))
unique = []
for v in source:
pair = v, type(v)
if pair not in pairs:
pairs.add(pair)
unique.append(v)
print(unique)