Seuraavassa on kuvaus siitä, miten määritetään, onko listalla (array) päällekkäisiä elementtejä (kaikki elementit ovat uniikkeja\yksilöllisiä) Pythonissa kussakin seuraavista tapauksista.
- Kun kyseessä on lista, jonka elementissä ei ole listaa
- Luetteloille, joissa on elementtiluetteloita (kaksiulotteiset taulukot, luetteloiden luettelot jne.).
Katso seuraavasta artikkelista, miten luettelosta poistetaan tai poimitaan päällekkäisiä elementtejä.
Huomaa, että luettelot voivat tallentaa erityyppistä dataa ja eroavat selvästi matriiseista. Jos haluat käsitellä matriiseja prosesseissa, jotka vaativat muistin kokoa ja muistiosoitteita tai suurten tietojen numeerista käsittelyä, käytä arraya (standardikirjasto) tai NumPy:tä.
Määritetään, onko luettelossa päällekkäisiä elementtejä (jos elementillä ei ole luetteloa).
Jos elementillä ei ole päivitettävää objektia, kuten listaa, käytä set set-tyypin konstruktoria set().
Joukkotyyppi on tietotyyppi, jossa ei ole päällekkäisiä elementtejä. Kun lista annetaan konstruktorille set(), päällekkäiset arvot jätetään huomiotta ja palautetaan set-tyyppinen objekti, jonka elementteinä on vain uniikkeja arvoja.
Tämän set-tyyppisen objektin ja alkuperäisen listan elementtien lukumäärä saadaan ja niitä verrataan käyttämällä sisäänrakennettua funktiota len().
- Jos elementtien määrä on sama, alkuperäisessä luettelossa ei ole päällekkäisiä elementtejä.
- Alkuperäiseen luetteloon sisällytetään päällekkäiset elementit, jos elementtien lukumäärä on erilainen.
Funktiot, jotka palauttavat väärän arvon, jos päällekkäisiä elementtejä ei ole, ja oikean arvon, jos on päällekkäisiä elementtejä, ovat seuraavat
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
Esimerkki on lista, mutta samaa funktiota voidaan käyttää myös tupleille.
Muuttuvat (päivitettävät) objektit, kuten luettelot, eivät voi olla tyypin set elementtejä. Siksi listat, joiden elementteinä on listoja (kaksiulotteiset matriisit, listojen listat jne.), aiheuttavat TypeError-virheen. Vastatoimi on esitetty alla.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Määritä, onko luettelossa päällekkäisiä elementtejä (jos elementillä on luettelo).
Kun kyseessä on lista, jossa on useita elementtejä (kuten listojen lista), voidaan seuraavien funktioiden avulla määrittää, onko listassa päällekkäisiä elementtejä.
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():n sijasta list comprehension -merkintätapa tuottaa listan, jonka elementit ovat vain uniikkeja arvoja, ja elementtien lukumäärää verrataan. Katso lisätietoja seuraavasta artikkelista.
Tämä funktio pätee myös listoille, joilla ei ole elementtiluetteloa.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Tähänastinen esimerkki on sen määrittäminen, onko elementtiluettelo päällekkäinen (sisältääkö se saman luettelon).
Se, ovatko kunkin listan elementit päällekkäin, voidaan määrittää sen jälkeen, kun alkuperäinen lista on tasoitettu yhteen ulottuvuuteen.
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
Tässä käytetään sum()-toimintoa listan tasoittamiseen, mutta myös itertools.chain.from_iterable()-toimintoa voidaan käyttää. Lisäksi, kun litistetään kolmen tai useamman ulottuvuuden listaa, on tarpeen määritellä uusi funktio.