Poniżej opisano sposób określania w języku Python, czy lista (tablica) ma zduplikowane elementy (wszystkie elementy są unikatowe) dla każdego z poniższych przypadków.
- W przypadku listy, której element nie zawiera żadnej listy
- W przypadku list z listami elementów (tablice dwuwymiarowe, listy list itp.)
Informacje o tym, jak usunąć lub wyodrębnić z listy zduplikowane elementy, można znaleźć w poniższym artykule.
Należy pamiętać, że listy mogą przechowywać różne typy danych i różnią się ściśle od tablic. Jeśli chcesz obsługiwać tablice w procesach, które wymagają wielkości pamięci i adresów pamięci lub numerycznego przetwarzania dużych danych, użyj tablicy (biblioteka standardowa) lub NumPy.
Określ, czy na liście są zduplikowane elementy (jeśli element nie ma listy)
Jeśli element nie ma obiektu aktualizowalnego, takiego jak lista, należy użyć konstruktora set() typu set.
Typ set jest typem danych, który nie posiada zduplikowanych elementów. Gdy do konstruktora set() zostanie przekazana lista, zduplikowane wartości są ignorowane i zwracany jest obiekt typu set, którego elementami są tylko unikalne wartości.
Liczbę elementów w tym obiekcie typu set oraz w oryginalnej liście uzyskuje się i porównuje za pomocą wbudowanej funkcji len().
- Jeśli liczba elementów jest równa, na oryginalnej liście nie ma zduplikowanych elementów
- Zduplikowane elementy są dołączane do oryginalnej listy, jeśli liczba elementów jest różna
Funkcje, które zwracają wartość false, jeśli nie ma zduplikowanych elementów, i wartość true, jeśli są zduplikowane elementy, są następujące
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
Przykładem jest lista, ale tę samą funkcję można zastosować do tupli.
Zmienne (aktualizowalne) obiekty, takie jak listy, nie mogą być elementami typu set. Dlatego listy z listami jako elementami (tablice dwuwymiarowe, listy list itp.) będą skutkowały błędem typu TypeError. Poniżej przedstawiono sposób przeciwdziałania temu problemowi.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Określ, czy na liście są zduplikowane elementy (jeśli element ma listę)
W przypadku listy z listą elementów (np. listy list) do określenia, czy istnieją zduplikowane elementy, można użyć następujących funkcji.
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
Zamiast funkcji set(), notacja list comprehension generuje listę, której elementami są tylko unikalne wartości, a liczba elementów jest porównywana. Szczegółowe informacje na ten temat można znaleźć w poniższym artykule.
Funkcja ta jest również ważna dla list, które nie mają listy elementów.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Dotychczasowym przykładem jest określenie, czy lista elementów jest zduplikowana (zawiera tę samą listę).
To, czy elementy każdej listy zachodzą na siebie, można określić po spłaszczeniu oryginalnej listy do jednego wymiaru.
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
W tym przypadku do spłaszczenia listy użyto funkcji sum(), ale można również użyć funkcji itertools.chain.from_iterable(). Dodatkowo, gdy spłaszczamy listę o trzech lub więcej wymiarach, konieczne jest zdefiniowanie nowej funkcji.