Нижче наведено опис того, як визначити, чи список (масив) має повторювані елементи (усі елементи є унікальними/унікальними) у 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(). Крім того, під час вирівнювання списку з трьох або більше вимірів необхідно визначити нову функцію.