Собесов

alexeygrigorev/data-science-interviews: удалить дубликаты из списка

PythonСтруктуры данныхЛёгкаяJunior

Условие

Удалите дубликаты из списка. Уточните: важен ли порядок исходных элементов? Если важен — первое вхождение должно остаться на своём месте.

Решение

Подход

Без сохранения порядка — приведение к set. С сохранением порядка — два варианта: либо использовать dict.fromkeys(lst) (с Python 3.7 порядок ключей в словаре стабильный), либо вручную пройти и отслеживать виденные элементы в set.

Реализация

# Без сохранения порядка
def dedup_unordered(lst: list) -> list:
    return list(set(lst))
 
# С сохранением порядка — питоничный способ
def dedup_ordered(lst: list) -> list:
    return list(dict.fromkeys(lst))
 
# С сохранением порядка — явный цикл
def dedup_ordered_manual(lst: list) -> list:
    seen = set()
    out = []
    for x in lst:
        if x not in seen:
            seen.add(x)
            out.append(x)
    return out

Подводные камни

  1. set(lst) теряет порядок. На больших списках Python обычно выдаёт стабильный вид, но опираться на это нельзя.
  2. Элементы должны быть хэшируемыми. Список словарей через set не пройдёт — нужно делать ключ из tuple(sorted(d.items())) или сравнивать вручную.
  3. Если в списке есть nannan != nan, и set оставит несколько NaN-ов. Обрабатывайте отдельно.

Эталонный ответ

list(set(lst)) без порядка; list(dict.fromkeys(lst)) с порядком; ручной цикл с seen = set(), если элементы нехэшируемые.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти