Как лучше всего (как обычно) проверить, все ли элементы в списке уникальны?
Мой текущий подход с использованием Counter
:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
Могу я сделать лучше?
len(x) > len(set(x))
имеет значение True, если элементыx
НЕ уникальны. Название на этот вопрос спрашивает как раз наоборот: «Проверка , если все элементы в списке являются уникальными»Вот двухстрочный вариант, который также выполняет ранний выход:
Если элементы x не могут быть хешированы, вам придется прибегнуть к использованию списка для
seen
:источник
Решение для раннего выхода может быть
однако для небольших случаев или если ранний выход не является обычным случаем, я ожидал бы, что
len(x) != len(set(x))
это самый быстрый метод.источник
s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
быть быстрее, если ранний выход не является обычным явлением? Разве обе операции не O (len (x)) ? (гдеx
находится исходный список)if x in s
внутри цикла O (len (x)) for.по скорости:
источник
Как насчет добавления всех записей в набор и проверки его длины?
источник
len()
.Вместо a
set
вы можете использоватьdict
.источник
Другой подход полностью, используя сортировку и группировку:
Требуется сортировка, но завершается работа по первому повторяющемуся значению.
источник
groupby
и нашел этот ответ. Я считаю это наиболее элегантным, поскольку это единственное выражение, которое работает со встроенными инструментами, не требуя дополнительных переменных или операторов цикла.id()
функцию для их сортировки, поскольку это является предварительным условием дляgroupby()
работы:groupby(sorted(seq), key=id)
Вот рекурсивная версия O (N 2 ) для развлечения:
источник
Вот рекурсивная функция раннего выхода:
Для меня это достаточно быстро, без использования странных (медленных) преобразований при функциональном подходе.
источник
H in T
выполняет линейный поиск иT = L[1:]
копирует разрезанную часть списка, поэтому это будет намного медленнее, чем другие решения, предложенные в больших списках. Я думаю, это O (N ^ 2), в то время как большинство других - O (N) (наборы) или O (N log N) (решения на основе сортировки).Как насчет этого
источник
Вы можете использовать синтаксис Яна (len (x)> len (set (x))), но вместо set (x) определите функцию:
и выполните len (x)> len (f5 (x)). Это будет быстро и одновременно с сохранением порядка.
Код взят из: http://www.peterbe.com/plog/uniqifiers-benchmark
источник
x = range(1000000) + range(1000000)
, set (x) быстрее, чем f5 (x). Порядок не является требованием в вопросе, но даже запуск sorted (set (x)) все равно быстрее, чем f5 (x)Используя аналогичный подход в кадре данных Pandas, чтобы проверить, содержит ли содержимое столбца уникальные значения:
Для меня это происходит мгновенно для переменной int в рамке даты, содержащей более миллиона строк.
источник
все ответы выше хороши, но я предпочитаю использовать
all_unique
пример из 30 секунд pythonвам нужно использовать
set()
в данном списке для удаления дубликатов, сравнить его длину с длиной списка.он возвращается,
True
если все значения в плоском списке равныunique
, вFalse
противном случаеисточник
Для начинающих:
источник