Az alábbiakban leírjuk, hogyan határozhatjuk meg Pythonban, hogy egy lista (tömb) duplikált elemekkel rendelkezik-e (minden elem egyedi\unique), az alábbi esetek mindegyikére.
- Olyan lista esetén, amelynek elemében nincs lista
- Elemekből álló listákhoz (kétdimenziós tömbök, listák listái stb.)
A duplikált elemek eltávolításáról vagy kivonásáról egy listából lásd a következő cikket.
Vegye figyelembe, hogy a listák különböző típusú adatokat tárolhatnak, és szigorúan különböznek a tömböktől. Ha olyan folyamatokban szeretnénk tömböket kezelni, amelyek memóriaméretet és memóriacímeket vagy nagyméretű adatok numerikus feldolgozását igénylik, használjuk a array (standard könyvtár) vagy a NumPy programot.
Meghatározza, hogy vannak-e duplikált elemek a listában (ha az elemnek nincs listája).
Ha az elem nem rendelkezik frissíthető objektummal, például listával, használja a set set típusú set() konstruktort.
A halmaz típus olyan adattípus, amelynek nincsenek duplikált elemei. Amikor egy listát adunk át a set() konstruktornak, a duplikált értékeket figyelmen kívül hagyjuk, és egy set típusú objektumot kapunk vissza, amelynek elemei csak egyedi értékek.
Az elemszámot ebben a halmaz típusú objektumban és az eredeti listában a len() beépített függvény segítségével kapjuk meg és hasonlítjuk össze.
- Ha az elemek száma megegyezik, akkor az eredeti listában nincsenek duplikált elemek.
- A duplikált elemek az eredeti listában szerepelnek, ha az elemek száma eltérő.
Azok a függvények, amelyek hamis értéket adnak vissza, ha nincsenek duplikált elemek, és igazat, ha vannak duplikált elemek, a következők
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
A példa egy listára vonatkozik, de ugyanez a függvény használható tuplikra is.
A változtatható (frissíthető) objektumok, mint például a listák, nem lehetnek a set típus elemei. Ezért a listákat tartalmazó listák (kétdimenziós tömbök, listák listái stb.) TypeError-t eredményeznek. Az ellenintézkedés az alábbiakban látható.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Meghatározza, hogy vannak-e duplikált elemek a listában (ha az elemnek van listája).
Az elemekből álló listák (például listák listája) esetében a következő függvények segítségével határozhatjuk meg, hogy vannak-e duplikált elemek.
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
A set() helyett a lista megértése jelölés egy olyan listát generál, amelynek elemei csak egyedi értékek, és az elemek számát hasonlítjuk össze. A részleteket lásd a következő cikkben.
Ez a függvény olyan listákra is érvényes, amelyeknek nincsenek elemei.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Az eddigi példa annak meghatározása, hogy az elemek listája duplikált-e (ugyanazt a listát tartalmazza-e).
Azt, hogy az egyes listák elemei átfedik-e egymást, az eredeti lista egy dimenzióra való leegyszerűsítése után lehet meghatározni.
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
Itt a sum()-ot használjuk a lista kiegyenlítésére, de az itertools.chain.from_iterable() is használható. Ezenkívül három vagy több dimenzióból álló listák laposítása esetén új függvényt kell definiálni.