← Назад к вопросам

Какой тип данных использовал бы для удаления дубликатов из списка?

1.0 Junior🔥 191 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Удаление дубликатов из списка: выбор типа данных

Для удаления дубликатов из списка в Python есть несколько подходов, и выбор зависит от требований к производительности, порядку элементов и типам данных в списке.

Способ 1: Set (множество) — самый быстрый

Множество (set) — это идеальный выбор для удаления дубликатов благодаря автоматической фильтрации уникальных элементов и O(1) времени поиска:

# Простое преобразование в set и обратно в список
original_list = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_list = list(set(original_list))
print(unique_list)  # [1, 2, 3, 4, 5] (порядок не гарантирован)

# Если нужно сохранить порядок (Python 3.7+)
unique_list = list(dict.fromkeys(original_list))
print(unique_list)  # [1, 2, 3, 4, 5] (порядок сохранён)

Преимущества:

  • Очень быстро O(n) по времени, O(n) по памяти
  • Встроенный тип данных
  • Элегантный и понятный код

Недостатки:

  • Порядок элементов не гарантирован (в старых версиях Python)
  • Работает только с хешируемыми типами (int, str, tuple, но не list, dict)

Способ 2: Dict.fromkeys() — сохраняет порядок

Начиная с Python 3.7, словари сохраняют порядок вставки. Это идеальный способ удалить дубликаты и сохранить исходный порядок:

original_list = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique_list = list(dict.fromkeys(original_list))
print(unique_list)  # [1, 2, 3, 4, 5] (порядок сохранён)

# Со строками
original_list = [apple, banana, apple, cherry, banana]
unique_list = list(dict.fromkeys(original_list))
print(unique_list)  # [apple, banana, cherry]

Преимущества:

  • O(n) по времени и памяти
  • Сохраняет исходный порядок элементов
  • Работает со всеми хешируемыми типами

Способ 3: Цикл с проверкой (для случаев с нехешируемыми типами)

Если в списке содержатся нехешируемые типы (список, словарь), нужно использовать цикл с проверкой:

original_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"},  # Дубликат
]

# Подход с проверкой (работает с нехешируемыми типами)
unique_list = []
for item in original_list:
    if item not in unique_list:
        unique_list.append(item)

print(unique_list)
# [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

Недостатки:

  • O(n²) сложность по времени (для каждого элемента проверяется весь список)
  • Медленно для больших списков

Способ 4: Set для нехешируемых типов через id() или JSON

Если нужна высокая производительность с нехешируемыми типами:

import json

# Способ через JSON сериализацию (для словарей)
original_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"},
]

unique_list = []
seen = set()

for item in original_list:
    # Преобразуем словарь в JSON для хеширования
    item_json = json.dumps(item, sort_keys=True)
    if item_json not in seen:
        seen.add(item_json)
        unique_list.append(item)

print(unique_list)

Способ 5: Numpy для больших массивов

Для работы с большими числовыми массивами можно использовать numpy:

import numpy as np

original_array = np.array([1, 2, 2, 3, 3, 3, 4, 5, 5])
unique_array = np.unique(original_array)
print(unique_array)  # [1 2 3 4 5]

Сравнение методов

МетодТип данныхСохраняет порядокСложностьСкорость
set()ХешируемыеНетO(n)⭐⭐⭐⭐⭐
dict.fromkeys()ХешируемыеДаO(n)⭐⭐⭐⭐⭐
ЦиклЛюбыеДаO(n²)
JSON + setСловариДаO(n)⭐⭐⭐⭐
numpyЧисловыеДаO(n log n)⭐⭐⭐⭐

Практические примеры

# 1. Быстрое удаление дубликатов целых чисел
numbers = [1, 2, 2, 3, 3, 3]
unique = list(set(numbers))

# 2. Удаление дубликатов со строками и сохранением порядка
words = [apple, banana, apple, cherry]
unique = list(dict.fromkeys(words))

# 3. Удаление дубликатов объектов по полю
users = [{"id": 1}, {"id": 2}, {"id": 1}]
unique = list({u["id"]: u for u in users}.values())

Рекомендации

  1. Для хешируемых типов (int, str, tuple):

    • Если важен порядок: list(dict.fromkeys(list))
    • Если порядок не важен: list(set(list))
  2. Для нехешируемых типов (list, dict):

    • Небольшие списки: цикл с проверкой
    • Большие словари: JSON + set
    • Очень большие числовые массивы: numpy
  3. Золотое правило: Используйте set для максимальной производительности, но помните о потере порядка элементов.