Ниже описано, как в Python определить, есть ли в списке (массиве) дублирующиеся элементы (все элементы уникальны\уникальны), для каждого из следующих случаев.
- Для списка, в котором нет ни одного элемента
- Для списков со списками элементов (двумерные массивы, списки списков и т.д.)
О том, как удалить или извлечь дублирующиеся элементы из списка, читайте в следующей статье.
Обратите внимание, что списки могут хранить различные типы данных и строго отличаются от массивов. Если вы хотите работать с массивами в процессах, где требуется размер памяти и адреса памяти или численная обработка больших данных, используйте array (стандартная библиотека) или NumPy.
Определите, есть ли в списке дублирующиеся элементы (если элемент не имеет списка)
Если у элемента нет обновляемого объекта, такого как список, используйте конструктор set() типа set set.
- СООТВЕТСТВУЮЩИЕ:Операции с множествами (например, определение объединения множеств, произведения множеств и подмножеств) с помощью типа множеств Python
Тип 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(). Кроме того, при сглаживании списка из трех и более измерений необходимо определить новую функцию.