По-долу е описано как да определим дали даден списък (масив) има дублиращи се елементи (всички елементи са уникални\уникални) в Python за всеки от следните случаи.
- За списък, в чийто елемент няма списък
- За списъци със списъци от елементи (двумерни масиви, списъци от списъци и т.н.)
Вижте следната статия за това как да премахнете или извлечете дублиращи се елементи от списък.
Обърнете внимание, че списъците могат да съхраняват различни типове данни и се различават строго от масивите. Ако искате да работите с масиви в процеси, които изискват размер на паметта и адреси в паметта или числена обработка на големи данни, използвайте array (стандартна библиотека) или NumPy.
Определяне дали в списъка има дублиращи се елементи (ако елементът няма списък)
Ако елементът няма обект, който може да се актуализира, например списък, използвайте конструктора 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. Следователно списъци със списъци като елементи (двумерни масиви, списъци от списъци и т.н.) ще доведат до грешка на типа. Мярката за противодействие е показана по-долу.
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(). Освен това при изравняване на списък с три или повече измерения е необходимо да се дефинира нова функция.