Určení, zda má seznam (pole) duplicitní prvky v jazyce Python

Podnikání

Níže je popsáno, jak v jazyce Python zjistit, zda má seznam (pole) duplicitní prvky (všechny prvky jsou jedinečné), a to pro každý z následujících případů.

  • Pro seznam bez seznamu v prvku
  • Pro seznamy se seznamy prvků (dvourozměrná pole, seznamy seznamů atd.)

Jak odstranit nebo vyjmout duplicitní prvky ze seznamu se dozvíte v následujícím článku.

Všimněte si, že seznamy mohou uchovávat různé typy dat a striktně se liší od polí. Pokud chcete s poli pracovat v procesech, které vyžadují velikost paměti a paměťové adresy nebo numerické zpracování velkých dat, použijte pole (standardní knihovna) nebo NumPy.

Určení, zda jsou v seznamu duplicitní prvky (pokud prvek nemá seznam)

Pokud prvek nemá aktualizovatelný objekt, například seznam, použijte konstruktor set() typu set.

Typ množiny je datový typ, který nemá duplicitní prvky. Pokud je konstruktoru set() předán seznam, duplicitní hodnoty jsou ignorovány a je vrácen objekt typu set, jehož prvky jsou pouze jedinečné hodnoty.

Počet prvků v tomto objektu typu množina a v původním seznamu se zjistí a porovná pomocí vestavěné funkce len().

  • Pokud je počet prvků stejný, v původním seznamu nejsou žádné duplicitní prvky.
  • Duplicitní prvky jsou zahrnuty do původního seznamu, pokud se počet prvků liší.

Funkce, které vracejí false, pokud neexistují duplicitní prvky, a true, pokud duplicitní prvky existují, jsou následující.

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

V příkladu je uveden seznam, ale stejnou funkci lze použít i pro tuply.

Mutabilní (aktualizovatelné) objekty, jako jsou seznamy, nemohou být prvky typu množina. Proto seznamy se seznamy jako prvky (dvourozměrná pole, seznamy seznamů atd.) budou mít za následek chybu typu. Protiopatření je uvedeno níže.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Určení, zda jsou v seznamu duplicitní prvky (pokud má prvek seznam).

V případě seznamu s řadou prvků (např. seznamu seznamů) lze k určení existence duplicitních prvků použít následující funkce.

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

Namísto funkce set() se při zápisu srozumitelnosti seznamu generuje seznam, jehož prvky jsou pouze jedinečné hodnoty, a porovnává se počet prvků. Podrobnosti naleznete v následujícím článku.

Tato funkce platí i pro seznamy, které nemají seznam prvků.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Dosavadním příkladem je určení, zda je seznam prvků duplicitní (obsahuje stejný seznam).

Zda se prvky jednotlivých seznamů překrývají, lze zjistit po zploštění původního seznamu na jednu dimenzi.

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

Zde se k zploštění seznamu používá funkce sum(), ale lze použít i itertools.chain.from_iterable(). Při zplošťování seznamu o třech a více rozměrech je navíc nutné definovat novou funkci.