Определение наличия в списке (массиве) дублирующихся элементов в Python

Бизнес

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

  • Для списка, в котором нет ни одного элемента
  • Для списков со списками элементов (двумерные массивы, списки списков и т.д.)

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

Обратите внимание, что списки могут хранить различные типы данных и строго отличаются от массивов. Если вы хотите работать с массивами в процессах, где требуется размер памяти и адреса памяти или численная обработка больших данных, используйте array (стандартная библиотека) или NumPy.

Определите, есть ли в списке дублирующиеся элементы (если элемент не имеет списка)

Если у элемента нет обновляемого объекта, такого как список, используйте конструктор set() типа set set.

Тип set — это тип данных, который не имеет дублирующихся элементов. Когда список передается конструктору set(), дублирующиеся значения игнорируются, и возвращается объект типа 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

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

Изменяемые (обновляемые) объекты, такие как списки, не могут быть элементами типа set. Поэтому списки со списками в качестве элементов (двумерные массивы, списки списков и т.д.) приведут к ошибке типа 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() нотация list comprehension формирует список, элементами которого являются только уникальные значения, а количество элементов сравнивается. Подробности см. в следующей статье.

Эта функция также действительна для списков, которые не имеют списка элементов.

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