Короткий ответ
Уникальность элементов проверяется превращением списка во множество: если длина не изменилась, дубликатов нет — len(data) == len(set(data)). Частоту символов или слов удобно считать через collections.Counter, который возвращает словарь вида «элемент — количество вхождений».
Как это работает подробнее
Обе задачи решаются структурами с быстрым доступом: set отвечает на вопрос о дубликатах, а словарь хранит счётчики вхождений.
- Множество против списка. Множество хранит только уникальные элементы, поэтому равенство длин списка и множества означает отсутствие повторов.
- Скорость операций. Добавление и проверка вхождения в set и dict выполняются в среднем за
O(1), поэтому весь проход занимаетO(n). - Поиск дубликатов. Чтобы найти сами повторы, иди по списку и складывай элементы в set, отмечая те, что уже встречались.
- Counter.
collections.Counter— подкласс словаря, который сам подсчитывает количество вхождений элементов итерируемого объекта. - Частота слов. Текст разбивают на слова через
split(), аlower()объединяет варианты одного слова в разных регистрах.
Пример кода
Уникальность элементов и подсчёт частот
from collections import Counter
def check_distinct(values):
return len(values) == len(set(values))
print(check_distinct([1, 6, 5, 8])) # True
print(check_distinct([2, 2, 5, 5, 7, 8])) # False
print(Counter('abracadabra'))
print(Counter('hello world hello'.split()))Что использовать на практике
- Проверка уникальности. Используй сравнение длин
len(values) == len(set(values))— просто, быстро и работает для любых хэшируемых данных. - Подсчёт частот. Бери
collections.Counterвместо ручного словаря: меньше кода и удобные методы вродеmost_common(). - Частота слов. Передавай в Counter результат
text.lower().split()— получишь частоты слов с учётом регистра. - Большие тексты. Для подсчёта символов файла достаточно обернуть его чтение в Counter, не строя лишних промежуточных структур.
Подводные камни
- Нехэшируемые элементы. set и ключи dict требуют хэшируемых значений — вложенные список или словарь положить в множество нельзя.
- Регистр. «Python» и «python» — разные строки: без
lower()частоты одного слова разъедутся по разным ключам. - Пунктуация. Знаки препинания прилипают к словам при простом
split(), поэтому слово с точкой посчитается отдельно. - Средний случай. Быстрый доступ set и dict гарантирован в среднем; при плохой хэш-функции возможна деградация производительности.
Как отвечать на собеседовании
- Сначала показать проверку уникальности через
lenиset→ объяснить, почему операции множества работают заO(1)в среднем → перейти к подсчёту частот черезcollections.Counter→ показать подсчёт слов черезsplit()и упомянуть краевые случаи вроде регистра и пунктуации.