Следи опис како да утврдите да ли листа (низ) има дуплиране елементе (сви елементи су јединствени/јединствени) у Питхон-у, за сваки од следећих случајева.
- За листу без листе у елементу
- За листе са листама елемената (дводимензионални низови, листе листа, итд.)
Погледајте следећи чланак о томе како да уклоните или издвојите дупликате елемената са листе.
Имајте на уму да листе могу да чувају различите типове података и да се стриктно разликују од низова. Ако желите да рукујете низовима у процесима који захтевају величину меморије и меморијске адресе или нумеричку обраду великих података, користите низ (стандардна библиотека) или НумПи.
Одредите да ли постоје дуплирани елементи на листи (ако елемент нема листу)
Ако елемент нема објекат који се може ажурирати као што је листа, користите конструктор сет() типа скупа.
Тип скупа је тип података који нема дупле елементе. Када се листа прослеђује конструктору сет(), дупле вредности се занемарују и враћа се објекат типа скуп са само јединственим вредностима као елементима.
Број елемената у овом објекту типа скупа и оригиналној листи се добијају и пореде помоћу уграђене функције лен().
- Ако је број елемената једнак, у оригиналној листи нема дуплираних елемената
- Дупли елементи су укључени у оригиналну листу ако је број елемената различит
Функције које враћају фалсе ако нема дуплираних елемената и труе ако постоје дупли елементи су следеће
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
Пример је листа, али иста функција се може користити са торкама.
Променљиви (ажурирани) објекти као што су листе не могу бити елементи скупа типа. Према томе, листе са листама као елементима (дводимензионални низови, листе листа, итд.) ће резултирати грешком типа. Противмера је приказана испод.
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
Уместо сет(), нотација разумевања листе генерише листу чији су елементи само јединствене вредности, а број елемената се пореди. За детаље погледајте следећи чланак.
Ова функција важи и за листе које немају листу елемената.
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
Овде се сум() користи за изравнавање листе, али се такође може користити итертоолс.цхаин.фром_итерабле(). Поред тога, када поравнате листу од три или више димензија, потребно је дефинисати нову функцију.