I det følgende beskrives det, hvordan man kan afgøre, om en liste (array) har dublerede elementer (alle elementer er unikke) i Python for hvert af følgende tilfælde.
- For en liste uden en liste i elementet
- For lister med lister med lister af elementer (todimensionale arrays, lister af lister osv.)
Se følgende artikel om, hvordan du kan fjerne eller udtrække dobbelte elementer fra en liste.
Bemærk, at lister kan lagre forskellige typer data og er helt forskellige fra arrays. Hvis du ønsker at håndtere arrays i processer, der kræver hukommelsesstørrelse og hukommelsesadresser eller numerisk behandling af store data, skal du bruge array (standardbiblioteket) eller NumPy.
Bestem, om der er dobbelte elementer på listen (hvis elementet ikke har nogen liste)
Hvis elementet ikke har et objekt, der kan opdateres, f.eks. en liste, skal du bruge konstruktøren set() for set-sættetypen.
Sættetypen er en datatype, der ikke har nogen dubletter. Når en liste overgives til konstruktøren set(), ignoreres duplikerede værdier, og der returneres et objekt af typen set med kun unikke værdier som elementer.
Antallet af elementer i dette sættypeobjekt og i den oprindelige liste beregnes og sammenlignes ved hjælp af den indbyggede funktion len().
- Hvis antallet af elementer er lig med hinanden, er der ingen dubletter i den oprindelige liste
- Duplikater af elementer medtages i den oprindelige liste, hvis antallet af elementer er forskelligt
Funktioner, der returnerer false, hvis der ikke er nogen duplikerede elementer, og true, hvis der er duplikerede elementer, er som følger
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
Eksemplet er en liste, men den samme funktion kan bruges med tupler.
Ændrede (opdaterbare) objekter som f.eks. lister kan ikke være elementer af typen set. Derfor vil lister med lister som elementer (todimensionale arrays, lister af lister osv.) resultere i en TypeError. Modforanstaltningen er vist nedenfor.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Bestem, om der er duplikerede elementer i listen (hvis elementet har en liste)
I tilfælde af en liste med en liste af elementer (f.eks. en liste af lister) kan følgende funktioner bruges til at bestemme, om der er dublerede elementer.
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
I stedet for set() genererer list comprehension notationen en liste, hvis elementer kun er unikke værdier, og antallet af elementer sammenlignes. Se følgende artikel for nærmere oplysninger.
Denne funktion gælder også for lister, der ikke har en liste af elementer.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Eksemplet indtil videre er bestemmelsen af, om listen over elementer er duplikeret (indeholder den samme liste).
Det kan afgøres, om elementerne i hver liste overlapper hinanden, efter at den oprindelige liste er blevet fladtrykt til én dimension.
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
Her bruges sum() til at gøre listen flad, men itertools.chain.from_iterable() kan også bruges. Desuden er det nødvendigt at definere en ny funktion, når en liste med tre eller flere dimensioner skal udjævnes.