Визначення того, чи список (масив) має повторювані елементи в Python

Бізнес

Нижче наведено опис того, як визначити, чи список (масив) має повторювані елементи (усі елементи є унікальними/унікальними) у Python для кожного з наступних випадків.

  • Для списку без списку в елементі
  • Для списків зі списками елементів (двовимірні масиви, списки списків тощо)

Перегляньте наступну статтю про те, як видалити або витягти повторювані елементи зі списку.

Зауважте, що списки можуть зберігати різні типи даних і суворо відрізняються від масивів. Якщо ви хочете обробляти масиви в процесах, які вимагають розміру пам’яті та адрес пам’яті або чисельної обробки великих даних, використовуйте масив (стандартна бібліотека) або NumPy.

Визначте, чи є у списку повторювані елементи (якщо елемент не має списку)

Якщо елемент не має оновлюваного об’єкта, такого як список, скористайтеся конструктором set() типу набору.

Тип набору — це тип даних, який не має повторюваних елементів. Коли список передається конструктору set(), повторювані значення ігноруються, і повертається об’єкт типу, який має лише унікальні значення як елементи.

Кількість елементів у цьому об’єкті типу набору та вихідному списку отримуються та порівнюються за допомогою вбудованої функції len().

  • Якщо кількість елементів однакова, у вихідному списку немає повторюваних елементів
  • Повторювані елементи включаються до вихідного списку, якщо кількість елементів відрізняється

Функції, які повертають false, якщо немає повторюваних елементів, і true, якщо є повторювані елементи, такі

def has_duplicates(seq):
    return len(seq) != len(set(seq))

l = [0, 1, 2]
print(has_duplicates(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates(l))
# True

Прикладом є список, але ту ж функцію можна використовувати з кортежами.

Змінювані (оновлювані) об’єкти, такі як списки, не можуть бути елементами набору типів. Тому списки зі списками як елементами (двовимірні масиви, списки списків тощо) призведуть до TypeError. Контрзахід показано нижче.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Визначте, чи є у списку повторювані елементи (якщо елемент має список)

У разі списку зі списком елементів (наприклад, список списків) можна використовувати такі функції, щоб визначити, чи є елементи, що повторюються.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False

l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True

Замість set() нотація розуміння списку генерує список, елементи якого є лише унікальними значеннями, і кількість елементів порівнюється. Подробиці дивіться в наступній статті.

Ця функція також діє для списків, які не мають списку елементів.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Поки що прикладом є визначення того, чи дублюється список елементів (містить той самий список).

Чи можна визначити елементи кожного списку після зведення вихідного списку до одного виміру.

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True

Тут для вирівнювання списку використовується sum(), але також можна використовувати itertools.chain.from_iterable(). Крім того, під час вирівнювання списку з трьох або більше вимірів необхідно визначити нову функцію.

Copied title and URL