Посчитать количество уникальных элементов в списке?

У меня есть список, к примеру [0, 1, 1, 3, -1, 3]. Результат должен быть "4". Не понимаю, как это реализовать, возможно есть какая-то функция?


Ответы (4 шт):

Автор решения: CrazyElf
lst = [0, 1, 1, 3, -1, 3]
print(len(set(lst))

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

→ Ссылка
Автор решения: Zhihar
arr = [0, 1, 1, 3, -1, 3]

способ 1:

print(len(set(arr)))

способ 2:

arr2 = []
for i in arr:
    if i not in arr2:
        arr2.append(i)
print(len(arr2))

способ 3:

print(len([i for i in enumerate(sorted(arr)) if i[0] == 0 or i[1] != sorted(arr)[i[0] - 1]]))

способ 4:

print(len([i for i in zip(sorted(arr), sorted(arr)[1:] + [sorted(arr)[0]]) if i[0] != i[1]]))

способ 5:

print(len([i for i in range(len(arr)) if min(sorted(arr)[i:]) != min(sorted(arr)[i - 1:])]))

способ 6:

print(len([i for i in range(len(arr)) if arr[i] not in arr[i + 1:]]))

вариант 7:

print(len([i for i in range(len(arr)) if arr[i:].count(arr[i]) == 1]))
  • хватит разврата... и откопал стюардессу
→ Ссылка
Автор решения: Danis
print(sum(arr[i] not in arr[:i]for i in range(len(arr))))
print(len({el: 0 for el in arr}))
print(len({el for el in arr}))
print(len({*arr}))
→ Ссылка
Автор решения: Stanislav Volodarskiy

Корректное решение требует определённых усилий. Первое что нужно - функция которая умеет считать длину генератора. Так как мы оптимизируем решение по памяти, то len(list(...)) не подходит. Вот одно из из самых простых и ясных решений:

def count(a):
    return max(enumerate(a, 1), default=(0, None))[0]

Сосчитаем одинаковые соседние элементы в списке. На этот раз нам не нужно экономить память так как на входе у нас список (или кортеж, или строка - решение достаточно универсальное):

def n_duplicates(a):
    return count(None for a, b in zip(a[:-1], a[1:]) if a == b)

К сожалению, исходный список может иметь несоседние одинаковые элементы. Очевидно, их можно сделать соседними с помощью перестановки. Хотя мы не знаем какая именно перестановка нам нужна, мы точно знаем что это перестановка. Переберём перестановки, нам нужна та где количество дубликатов самое большое. Этот максимум вычтем из длины исходного массива:

def n_uniques(a):
    return len(a) - max(n_duplicates(b) for b in itertools.permutations(a))

Решение достаточно изящно и отлично работает:

@>>> print(n_uniques([0, 1, 1, 3, -1, 3]))
4
→ Ссылка