Посчитать количество уникальных элементов в списке?
У меня есть список, к примеру [0, 1, 1, 3, -1, 3].
Результат должен быть "4".
Не понимаю, как это реализовать, возможно есть какая-то функция?
Ответы (4 шт):
lst = [0, 1, 1, 3, -1, 3]
print(len(set(lst))
В принципе, это можно и вручную сделать через словарь, но есть готовый тип данных для хранения уникальных элементов set (множество).
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]))
- хватит разврата... и откопал стюардессу
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}))
Корректное решение требует определённых усилий. Первое что нужно - функция которая умеет считать длину генератора. Так как мы оптимизируем решение по памяти, то 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