Annak meghatározása, hogy egy listának (tömbnek) vannak-e duplikált elemei Pythonban

Üzleti

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.

Copied title and URL