Nasleduje opis toho, ako v jazyku Python určiť, či má zoznam (pole) duplicitné prvky (všetky prvky sú jedinečné), pre každý z nasledujúcich prípadov.
- Pre zoznam bez zoznamu v prvku
- Pre zoznamy so zoznamami prvkov (dvojrozmerné polia, zoznamy zoznamov atď.)
Pozrite si nasledujúci článok o tom, ako odstrániť alebo odstrániť duplicitné prvky zo zoznamu.
Všimnite si, že zoznamy môžu uchovávať rôzne typy údajov a striktne sa líšia od polí. Ak chcete pracovať s poliami v procesoch, ktoré vyžadujú veľkosť pamäte a pamäťové adresy alebo numerické spracovanie veľkých dát, použite array (štandardná knižnica) alebo NumPy.
Určenie, či sú v zozname duplicitné prvky (ak prvok nemá zoznam)
Ak prvok nemá aktualizovateľný objekt, napríklad zoznam, použite konštruktor set() typu set.
Typ množiny je dátový typ, ktorý nemá duplicitné prvky. Keď sa konštruktorovi set() odovzdá zoznam, duplicitné hodnoty sa ignorujú a vráti sa objekt typu set, ktorého prvkami sú len jedinečné hodnoty.
Počet prvkov v tomto objekte typu množina a v pôvodnom zozname sa získa a porovná pomocou vstavanej funkcie len().
- Ak je počet prvkov rovnaký, v pôvodnom zozname nie sú žiadne duplicitné prvky
- Duplicitné prvky sú zahrnuté do pôvodného zoznamu, ak sa počet prvkov líši
Funkcie, ktoré vracajú false, ak neexistujú duplicitné prvky, a true, ak duplicitné prvky existujú, sú tieto
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
V príklade je uvedený zoznam, ale rovnaká funkcia sa dá použiť aj pre kôpky.
Mutabilné (aktualizovateľné) objekty, ako napríklad zoznamy, nemôžu byť prvkami typu množina. Preto zoznamy so zoznamami ako prvkami (dvojrozmerné polia, zoznamy zoznamov atď.) budú mať za následok chybu typu. Protiopatrenie je uvedené nižšie.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Určenie, či sú v zozname duplicitné prvky (ak má prvok zoznam)
V prípade zoznamu so zoznamom prvkov (napríklad zoznamu zoznamov) možno na určenie, či existujú duplicitné prvky, použiť nasledujúce funkcie.
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
Namiesto funkcie set() sa pri zápise porozumenia zoznamu generuje zoznam, ktorého prvkami sú len jedinečné hodnoty a porovnáva sa počet prvkov. Podrobnosti nájdete v nasledujúcom článku.
Táto funkcia platí aj pre zoznamy, ktoré nemajú zoznam prvkov.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Doterajším príkladom je určenie, či je zoznam prvkov duplicitný (obsahuje rovnaký zoznam).
To, či sa prvky jednotlivých zoznamov prekrývajú, možno určiť po sploštení pôvodného zoznamu na jeden rozmer.
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
Tu sa na sploštenie zoznamu používa metóda sum(), ale možno použiť aj metódu itertools.chain.from_iterable(). Okrem toho, pri sploštení zoznamu s tromi alebo viacerými rozmermi je potrebné definovať novú funkciu.