Slijedi opis kako odrediti ima li popis (niz) duplicirane elemente (svi elementi su jedinstveni/jedinstveni) u Pythonu, za svaki od sljedećih slučajeva.
- Za popis bez popisa u elementu
- Za liste s popisima elemenata (dvodimenzionalni nizovi, popisi popisa, itd.)
Pogledajte sljedeći članak o tome kako ukloniti ili izdvojiti duplicirane elemente s popisa.
Imajte na umu da popisi mogu pohranjivati različite vrste podataka i da se striktno razlikuju od nizova. Ako želite rukovati nizovima u procesima koji zahtijevaju veličinu memorije i memorijske adrese ili numeričku obradu velikih podataka, koristite niz (standardna biblioteka) ili NumPy.
Odredite postoje li duplicirani elementi na popisu (ako element nema popis)
Ako element nema objekt koji se može ažurirati kao što je popis, upotrijebite konstruktor set() tipa skupa skupa.
Vrsta skupa je tip podataka koji nema duple elemente. Kada se popis proslijedi konstruktoru set(), duplicirane vrijednosti se zanemaruju i vraća se objekt tipa skup sa samo jedinstvenim vrijednostima kao elementima.
Broj elemenata u ovom objektu tipa skupa i izvorni popis dobivaju se i uspoređuju pomoću ugrađene funkcije len().
- Ako je broj elemenata jednak, u izvornom popisu nema dupliciranih elemenata
- Duplicirani elementi su uključeni u izvorni popis ako je broj elemenata različit
Funkcije koje vraćaju false ako nema dupliciranih elemenata i true ako postoje dupli elementi su sljedeće
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
Primjer je popis, ali ista funkcija se može koristiti s torkama.
Promjenjivi (ažurirani) objekti kao što su popisi ne mogu biti elementi skupa tipa. Stoga će popisi s popisima kao elementima (dvodimenzionalni nizovi, popisi popisa itd.) rezultirati pogreškom TypeError. Protumjera je prikazana u nastavku.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Odredite postoje li duplicirani elementi na popisu (ako element ima popis)
U slučaju popisa s popisom elemenata (kao što je popis popisa), sljedeće funkcije mogu se koristiti za određivanje postoje li dupli elementi.
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
Umjesto set(), zapis razumijevanja popisa generira popis čiji su elementi samo jedinstvene vrijednosti, a broj elemenata se uspoređuje. Za detalje pogledajte sljedeći članak.
Ova funkcija vrijedi i za popise koji nemaju popis elemenata.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Dosadašnji primjer je utvrđivanje je li popis elemenata dupliciran (sadrži isti popis).
Mogu li se elementi svakog popisa preklapati nakon izravnavanja izvornog popisa na jednu dimenziju.
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
Ovdje se sum() koristi za izravnavanje popisa, ali se također može koristiti itertools.chain.from_iterable(). Osim toga, kod izravnavanja popisa od tri ili više dimenzija, potrebno je definirati novu funkciju.