Как проверить, содержит ли список дубликаты в Python

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) мы рассмотрим, как проверить, содержит ли список дубликаты в Python. Понимание того, как определять дубликаты, является важным аспектом очистки, анализа и оптимизации данных.

Мы рассмотрим два основных метода: сравнение длины исходного списка с длиной его представления в виде множества и использование объекта collections.Counter. В лабораторном занятии сначала определяется, что такое дубликаты и почему их определение важно, а затем приводятся практические примеры кода на Python для демонстрации каждого метода, включая создание файла duplicates.py и реализацию функции для поиска дубликатов в списке.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/ControlFlowGroup -.-> python/for_loops("For Loops") python/DataStructuresGroup -.-> python/dictionaries("Dictionaries") python/DataStructuresGroup -.-> python/sets("Sets") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections") subgraph Lab Skills python/for_loops -.-> lab-559531{{"Как проверить, содержит ли список дубликаты в Python"}} python/dictionaries -.-> lab-559531{{"Как проверить, содержит ли список дубликаты в Python"}} python/sets -.-> lab-559531{{"Как проверить, содержит ли список дубликаты в Python"}} python/function_definition -.-> lab-559531{{"Как проверить, содержит ли список дубликаты в Python"}} python/data_collections -.-> lab-559531{{"Как проверить, содержит ли список дубликаты в Python"}} end

Определение дубликатов

На этом этапе мы рассмотрим, что такое дубликаты в контексте программирования и как их определить в Python. Понимание дубликатов является важным аспектом очистки, анализа и оптимизации данных.

Что такое дубликаты?

Дубликаты - это просто повторяющиеся значения в наборе данных или коллекции элементов. Например, в списке [1, 2, 2, 3, 4, 4, 4] числа 2 и 4 являются дубликатами, так как они встречаются более одного раза.

Зачем определять дубликаты?

Определение и обработка дубликатов важны по нескольким причинам:

  • Точность данных: Дубликаты могут исказить результаты анализа и привести к неверным выводам.
  • Эффективность хранения: Хранение дубликатов приводит к потере места и ресурсов.
  • Производительность: Обработка дубликатов может замедлить алгоритмы и приложения.

Определение дубликатов в Python

Начнем с создания Python-скрипта для определения дубликатов в списке.

  1. Откройте редактор VS Code.

  2. Создайте новый файл с именем duplicates.py в директории ~/project.

    ~/project/duplicates.py
  3. Добавьте следующий код в файл duplicates.py:

    def find_duplicates(data):
        seen = set()
        duplicates = []
        for item in data:
            if item in seen:
                duplicates.append(item)
            else:
                seen.add(item)
        return duplicates
    
    numbers = [1, 2, 2, 3, 4, 4, 4, 5]
    duplicate_numbers = find_duplicates(numbers)
    print("Original list:", numbers)
    print("Duplicate numbers:", duplicate_numbers)

    Пояснение:

    • Функция find_duplicates принимает список data в качестве входных данных.
    • Она использует множество (set) с именем seen для отслеживания элементов, которые она уже встретила. Множества полезны, так как они хранят только уникальные значения.
    • Она проходит по списку data. Если элемент уже находится в множестве seen, это означает, что он является дубликатом, поэтому он добавляется в список duplicates. В противном случае элемент добавляется в множество seen.
    • Наконец, функция возвращает список duplicates.
  4. Запустите скрипт с помощью следующей команды в терминале:

    python duplicates.py

    Вы должны увидеть следующий вывод:

    Original list: [1, 2, 2, 3, 4, 4, 4, 5]
    Duplicate numbers: [2, 4, 4]

    Этот вывод показывает исходный список и найденные в нем дубликаты.

Сравнение len() и len(set())

На этом этапе мы рассмотрим более эффективный способ обнаружения дубликатов в списке с использованием функции len() и структуры данных set(). Этот метод основан на том, что множества (sets) хранят только уникальные элементы.

Понимание len() и set()

  • len(): Эта функция возвращает количество элементов в списке или любом другом итерируемом объекте.
  • set(): Эта функция преобразует список (или любой итерируемый объект) в множество. Множество - это коллекция уникальных элементов, то есть оно автоматически удаляет все дубликаты.

Как это работает

Основная идея заключается в сравнении длины исходного списка с длиной множества, созданного из этого списка. Если длины различны, это означает, что в исходном списке были дубликаты.

Пример

Давайте модифицируем файл duplicates.py, который мы создали на предыдущем этапе, чтобы использовать этот подход.

  1. Откройте файл duplicates.py в директории ~/project с помощью VS Code.

  2. Измените код следующим образом:

    def has_duplicates(data):
        return len(data) != len(set(data))
    
    numbers = [1, 2, 2, 3, 4, 4, 4, 5]
    if has_duplicates(numbers):
        print("The list contains duplicates.")
    else:
        print("The list does not contain duplicates.")

    Пояснение:

    • Функция has_duplicates теперь просто сравнивает длину исходного списка data с длиной множества, созданного из data.
    • Если длины различны, функция возвращает True (то есть есть дубликаты), в противном случае возвращает False.
  3. Запустите скрипт с помощью следующей команды в терминале:

    python duplicates.py

    Вы должны увидеть следующий вывод:

    The list contains duplicates.

    Если вы измените список numbers на [1, 2, 3, 4, 5], вывод будет следующим:

    The list does not contain duplicates.

Этот метод более лаконичен и часто более эффективен, чем предыдущий метод, особенно для больших списков.

Использование collections.Counter

На этом этапе мы рассмотрим еще более мощный и "питонический" способ подсчета дубликатов с использованием класса collections.Counter. Этот класс специально разработан для подсчета частоты элементов в списке или другом итерируемом объекте.

Понимание collections.Counter

Класс collections.Counter является подклассом dict, который специально предназначен для подсчета хэшируемых объектов. Он хранит элементы в виде ключей словаря, а их количество - в виде значений словаря.

Как это работает

collections.Counter автоматически подсчитывает количество вхождений каждого элемента в списке. Затем вы можете легко получить доступ к этим счетчикам, чтобы определить дубликаты.

Пример

Давайте модифицируем файл duplicates.py в директории ~/project, чтобы использовать collections.Counter.

  1. Откройте файл duplicates.py в директории ~/project с помощью VS Code.

  2. Измените код следующим образом:

    from collections import Counter
    
    def find_duplicates_counter(data):
        counts = Counter(data)
        duplicates = [item for item, count in counts.items() if count > 1]
        return duplicates
    
    numbers = [1, 2, 2, 3, 4, 4, 4, 5]
    duplicate_numbers = find_duplicates_counter(numbers)
    print("Original list:", numbers)
    print("Duplicate numbers:", duplicate_numbers)

    Пояснение:

    • Мы импортируем класс Counter из модуля collections.
    • Функция find_duplicates_counter создает объект Counter из входного списка data. Это автоматически подсчитывает количество вхождений каждого элемента.
    • Затем мы используем генератор списка, чтобы создать список элементов, количество вхождений которых больше 1 (то есть дубликаты).
  3. Запустите скрипт с помощью следующей команды в терминале:

    python duplicates.py

    Вы должны увидеть следующий вывод:

    Original list: [1, 2, 2, 3, 4, 4, 4, 5]
    Duplicate numbers: [2, 4]

    Этот вывод показывает исходный список и найденные в нем дубликаты. Обратите внимание, что подход с использованием Counter возвращает только уникальные дубликаты, а не все вхождения дубликатов.

Резюме

В этом практическом занятии (lab) мы начали с определения дубликатов как повторяющихся значений в наборе данных и подчеркнули их влияние на точность данных, эффективность хранения и производительность. Затем мы создали скрипт на Python для определения дубликатов в списке с использованием функции find_duplicates.

Эта функция проходит по входному списку, используя множество (set) с именем seen для отслеживания уже встреченных элементов. Если элемент уже находится в seen, он определяется как дубликат и добавляется в список duplicates. Этот подход использует свойство множеств хранить только уникальные значения для эффективного обнаружения дубликатов.