Nedan beskrivs hur man i Python kan avgöra om en lista (array) har dubbla element (alla element är unika\unikala) för vart och ett av följande fall.
- För en lista utan någon lista i elementet
- För listor med listor med element (tvådimensionella matriser, listor med listor osv.)
Se följande artikel om hur du tar bort eller extraherar dubbla element från en lista.
Observera att listor kan lagra olika typer av data och skiljer sig strikt från matriser. Om du vill hantera matriser i processer som kräver minnesstorlek och minnesadresser eller numerisk behandling av stora data, använd array (standardbiblioteket) eller NumPy.
Bestäm om det finns dubbla element i listan (om elementet inte har någon lista).
Om elementet inte har ett objekt som kan uppdateras, t.ex. en lista, används konstruktören set() för typen set set.
Uppsättningstypen är en datatyp som inte har några dubbla element. När en lista skickas till konstruktören set() ignoreras dubbla värden och ett objekt av typen set med endast unika värden som element returneras.
Antalet element i detta objekt och i den ursprungliga listan erhålls och jämförs med hjälp av den inbyggda funktionen len().
- Om antalet element är lika stort finns det inga dubbla element i den ursprungliga listan.
- Dubbla element inkluderas i den ursprungliga listan om antalet element är olika.
Funktioner som returnerar falskt om det inte finns några dubbla element och sant om det finns dubbla element är följande
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
Exemplet är en lista, men samma funktion kan användas för tupler.
Mutabla (uppdaterbara) objekt, t.ex. listor, kan inte vara element av typen set. Därför kommer listor med listor som element (tvådimensionella arrayer, listor av listor osv.) att resultera i ett TypeError. Motåtgärden visas nedan.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Bestäm om det finns dubbla element i listan (om elementet har en lista).
När det gäller en lista med en lista med element (t.ex. en lista med listor) kan följande funktioner användas för att avgöra om det finns dubbla element.
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
Istället för set() genererar list comprehension-notationen en lista vars element endast består av unika värden, och antalet element jämförs. Se följande artikel för mer information.
Denna funktion gäller även för listor som inte har en lista med element.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Exemplet hittills är att avgöra om listan med element är duplicerad (innehåller samma lista).
Om elementen i varje lista överlappar varandra kan avgöras efter att den ursprungliga listan har plattats till en 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
Här används sum() för att jämna ut listan, men itertools.chain.from_iterable() kan också användas. När en lista med tre eller fler dimensioner ska plattas ut är det dessutom nödvändigt att definiera en ny funktion.