Проверить уникальность элементов списка

В списке чисел проверить, все ли элементы являются уникальными, то есть встречается ли каждое число только один раз. Усложненный вариант: вывести неуникальные значения, определить количество их повторов.

Проверка уникальности элементов списка на языке программирования Python
#
×

Решение задачи на языке программирования Python

Решить данную задачу на языке Python можно несколькими способами. Классический вариант — брать по очереди элементы списка и сравнить каждый со стоящими за ним. При первом же совпадении элементов делается вывод, что в списке есть одинаковы, и работа программы завершается.

from random import randint

N = 10  # количество элементов в списке

arr = [randint(1, 35) for i in range(N)]
print(arr)

for i in range(N-1):
    for j in range(i+1, N):
        if arr[i] == arr[j]:
            print("Есть одинаковые")
            quit()

print("Все элементы уникальны")

Здесь j принимает значения от следующего элемента за тем, для которого ищется совпадение, до последнего в списке. Сравнивать элемент с индексом i с элементами, стоящими впереди него, не надо, т.к. эти сравнения уже выполнялись на предыдущих итерациях внешнего цикла.

Еще одним способом решения может быть использование множеств (тип данных set). Как известно, в них не может быть одинаковых элементов. При преобразовании списка во множество в нем одинаковые элементы будут представлены единожды, то есть дубли удалятся. Если после этого сравнить длину исходного списка и множества, то станет ясно, есть ли в списке одинаковые элементы. Если длины совпадают, значит все элементы списка уникальны. Если нет, значит, были одинаковые.

setarr = set(arr)
if len(arr) == len(setarr):
    print("Все элементы уникальны")
else:
    print("Есть одинаковые")

Функция set() преобразует список во множество.

Примеры выполнения кода:

[2, 4, 1, 2, 45, 38, 26, 11, 49, 25]
Есть одинаковые
[44, 49, 21, 19, 23, 27, 34, 9, 41, 31]
Все элементы уникальны

В Python у списков есть метод count, который подсчитывает количество элементов списка, чьи значения совпадают с переданным в метод значением. Таким образом мы можем решить задачу, перебирая элементы списка и передавая каждый в метод count(item). Если хотя бы однажны метод вернет число больше 1, значит в списке имеются повторы значений.

from random import randrange

arr = [randrange(50) for i in range(10)]
print(*arr)

for item in arr:
    if arr.count(item) > 1:
        print("Есть одинаковые")
        break
else:
    print("Все элементы уникальны")

В программе выше ветка else цикла for срабатывает только в случае, если работа цикла не была прервана с помощью оператора break.

В более сложном варианте данной задачи может требоваться определить неуникальные элементы, то есть выявить значения, которые встречаются в списке более одного раза, а не просто сказать, есть повторы или нет. Здесь мы не можем использовать прерывание цикла, так как в списке может повторяться и другое значение. Также не можем для всех элементов списка вызывать count(), так как в этом случае метод будет вызываться повторно для уже учтенных ранее значений. Например, результат работы такой программы

from random import randrange

arr = [randrange(50) for i in range(10)]
print(*arr)

for item in arr:
    count = arr.count(item)
    if count > 1:
        print(f"Элемент {item} встречается {count} раза")

может выглядеть так:

9 36 43 21 48 6 19 13 3 48
Элемент 48 встречается 2 раза
Элемент 48 встречается 2 раза

Чтобы исключить из перебора повторы значений, мы можем преобразовать список во множество. После этого перебирать в цикле элементы множества, которые уникальны.

from random import randrange

arr = [randrange(25) for i in range(15)]
print(*arr)

set_arr = set(arr)

for item in set_arr:
    count = arr.count(item)
    if count > 1:
        print(f"Элемент {item} встречается {count} раза")
19 23 22 23 21 1 19 11 23 9 5 3 16 17 14
Элемент 19 встречается 2 раза
Элемент 23 встречается 3 раза