Järgnevalt kirjeldatakse, kuidas teha Pythonis kindlaks, kas loendil (massiivil) on dubleerivaid elemente (kõik elemendid on unikaalsed \ unikaalsed), iga järgmise juhtumi puhul.
- Nimekirja puhul, mille elemendis ei ole nimekirja
- Nimekirjade puhul, millel on elementide nimekirjad (kahemõõtmelised massiivid, nimekirjade nimekirjad jne).
Vaata järgmist artiklit selle kohta, kuidas eemaldada või eraldada loetelust dubleerivaid elemente.
Pange tähele, et loendid võivad salvestada erinevat tüüpi andmeid ja erinevad rangelt massiividest. Kui soovite käsitleda massiive protsessides, mis nõuavad mälu suurust ja mäluaadressi või suurte andmete numbrilist töötlemist, kasutage array (standardraamatukogu) või NumPy.
Määrata, kas nimekirjas on dubleerivaid elemente (kui elemendil ei ole nimekirja).
Kui elemendil ei ole uuendatavat objekti, näiteks nimekirja, siis kasutage konstruktorit set() tüübi set set.
Kogumitüüp on andmetüüp, millel ei ole dubleerivaid elemente. Kui konstruktorile set() antakse nimekiri, ignoreeritakse dubleerivaid väärtusi ja tagastatakse set-tüüpi objekt, mille elementidena on ainult unikaalsed väärtused.
Selle kogumitüüpi objekti ja algse loendi elementide arv saadakse ja neid võrreldakse sisseehitatud funktsiooni len() abil.
- Kui elementide arv on võrdne, ei ole algses nimekirjas dubleerivaid elemente.
- dubleerivad elemendid lisatakse algsesse loendisse, kui elementide arv on erinev
Funktsioonid, mis tagastavad false, kui dubleerivaid elemente ei ole, ja true, kui dubleerivaid elemente on, on järgmised
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
Näitena on toodud loetelu, kuid sama funktsiooni saab kasutada ka tuppide puhul.
Muutuvad (uuendatavad) objektid, nagu näiteks loendid, ei saa olla tüübi set elemendid. Seetõttu annavad loetelud, mille elemendid on loetelud (kahemõõtmelised massiivid, loetelude loetelud jne), TypeError'i. Vastumeede on näidatud allpool.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Määrata, kas nimekirjas on dubleerivaid elemente (kui element on nimekirjas).
Elementidest koosneva loendi (näiteks loendite loendi) puhul saab dubleerivate elementide olemasolu kindlakstegemiseks kasutada järgmisi funktsioone.
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() asemel genereerib loendi mõistmise notatsioon loendi, mille elemendid on ainult unikaalsed väärtused, ja elementide arvu võrreldakse. Vaata lähemalt järgmisest artiklist.
See funktsioon kehtib ka nimekirjade puhul, millel ei ole elementide nimekirja.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Senine näide on selle kindlakstegemine, kas elementide nimekiri on dubleeritud (sisaldab sama nimekirja).
Seda, kas iga loendi elemendid kattuvad, saab kindlaks teha pärast algse loendi tasandamist ühte mõõtmesse.
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
Siin kasutatakse loendi tasandamiseks sum(), kuid võib kasutada ka itertools.chain.from_iterable(). Lisaks sellele on kolme või enama mõõtmega loendi tasandamisel vaja defineerida uus funktsioon.