Например, учитывая список ['one', 'two', 'one']
, алгоритм должен возвращать True
, тогда как данный ['one', 'two', 'three']
должен возвращать False
.
python
string
list
duplicates
teggy
источник
источник
Рекомендуется только для коротких списков:
Вы не использовать в длинном списке - это может занять некоторое время , пропорциональное квадрату числа элементов в списке!
Для более длинных списков с хэшируемыми элементами (строки, числа и т. Д.):
Если ваши элементы не могут быть хэшируемыми (подсписки, диктанты и т. Д.), Они становятся более привлекательными, хотя все еще можно получить O (N logN), если они хотя бы сопоставимы. Но вам нужно знать или тестировать характеристики элементов (хэшируемые или нет, сопоставимые или нет), чтобы получить наилучшую производительность, какую вы можете - O (N) для хеш-файлов, O (N log N) для не хэшируемых сопоставлений, в противном случае это до O (N в квадрате), и с этим ничего не поделаешь :-(.
источник
all
все составляло 1). Дикт со всеми значениями True, который вы также упоминаете, - это смехотворно, бесполезно раздутая имитация aset
, без какой-либо добавленной стоимости. Big-O не все в программировании.Это старый, но ответы здесь привели меня к немного другому решению. Если вы склонны злоупотреблять пониманием, вы можете получить короткое замыкание таким образом.
источник
Если вы любите стиль функционального программирования, здесь полезная функция, самодокументированный и протестированный код с использованием doctest .
Оттуда вы можете проверить уникальность, проверив, пуст ли второй элемент возвращаемой пары:
Обратите внимание, что это неэффективно, поскольку вы явно строите декомпозицию. Но в соответствии с принципом использования Reduce вы можете найти что-то эквивалентное (но немного менее эффективное), чтобы ответить 5:
источник
Я подумал, что было бы полезно сравнить сроки различных решений, представленных здесь. Для этого я использовал свою собственную библиотеку
simple_benchmark
:Так что действительно для этого случая решение от Дениса Откидача самое быстрое.
Некоторые из подходов также демонстрируют гораздо более крутые кривые, это подходы, которые масштабируются квадратично с количеством элементов (первое решение Алекса Мартеллиса, wjandrea и оба решения Xavier Decorets). Также важно упомянуть, что решение для панд от Keiku имеет очень большой постоянный фактор. Но для больших списков это почти догоняет другие решения.
И в случае, если дубликат находится на первой позиции. Это полезно, чтобы увидеть, какие решения являются короткими замыканиями:
Здесь несколько подходов не закорачивают: Kaiku, Frank, Xavier_Decoret (первое решение), Turn, Алекс Мартелли (первое решение) и подход, представленный Денисом Откидачем (который был самым быстрым в случае без дублирования).
Я включил сюда функцию из моей собственной библиотеки: она
iteration_utilities.all_distinct
может конкурировать с самым быстрым решением в случае отсутствия дубликатов и работает в постоянном времени для случая дублирования при начале (хотя и не так быстро).Код для теста:
И для аргументов:
источник
Я недавно ответил на связанный вопрос, чтобы установить все дубликаты в списке, используя генератор. Преимущество этого метода в том, что если его использовать просто для определения «есть ли дубликат», то вам просто нужно получить первый элемент, а остальные можно игнорировать, что является окончательным ярлыком.
Это интересный подход, основанный на множествах, который я адаптировал прямо из moooeeeep :
Соответственно полный список дупов будет
list(getDupes(etc))
. Чтобы просто проверить «если» есть дублирование, его следует обернуть следующим образом:Это хорошо масштабируется и обеспечивает стабильное время работы, где бы ни был дубликат в списке - я протестировал со списками до 1 млн записей. Если вы знаете что-то о данных, в частности, о том, что дупсы, скорее всего, появятся в первой половине, или о других вещах, которые позволяют исказить ваши требования, например о необходимости получения фактических дупликов, то есть пара действительно альтернативных локаторов дупеков. это может превзойти. Я рекомендую два ...
Простой подход, основанный на диктовке, очень удобочитаемый:
Используйте itertools (по сути, ifilter / izip / tee) в отсортированном списке, очень эффективно, если вы получаете все дубли, хотя и не так быстро, чтобы получить только первое:
Это были лучшие исполнители из подходов, которые я пробовал для полного списка дублирования , причем первый дублирование встречалось где-либо в списке элементов длиной 1 м от начала до середины. Было удивительно, насколько мало добавилось в шаге сортировки. Ваш пробег может отличаться, но вот мои конкретные результаты по времени:
источник
.next()
Вызова в вашем втором блоке кода не работает на Python 3.x. Я думаю, чтоnext(getDupes(l))
должно работать на всех версиях Python, поэтому имеет смысл изменить это.ifilter
иìzip
может быть просто заменен на встроенныйfilter
иzip
в Python 3.x.Еще один способ сделать это кратко с помощью Counter .
Чтобы просто определить, есть ли дубликаты в исходном списке:
Или получить список элементов, которые имеют дубликаты:
источник
источник
Я обнаружил, что это дает лучшую производительность, потому что он закорачивает операцию, когда первый дубликат обнаружил ее, а затем этот алгоритм имеет сложность времени и пространства O (n), где n - длина списка:
источник
Я на самом деле не знаю, что происходит за кулисами, поэтому я просто хочу, чтобы все было просто.
источник
Более простое решение заключается в следующем. Просто проверьте True / False с помощью
.duplicated()
метода панд, а затем возьмите сумму. Пожалуйста, смотрите также pandas.Series.duplicated - документация для pandas 0.24.1.источник
Если список содержит не подлежащие изменению элементы, вы можете использовать решение Алекса Мартелли, но со списком вместо набора, хотя для более крупных входов он медленнее: O (N ^ 2).
источник
Я использовал подход Pyrospade, для его простоты, и немного изменил его в коротком списке, сделанном из регистра Windows без учета регистра.
Если необработанная строка значения PATH разбита на отдельные пути, все нулевые пути (пустые или только пробельные строки) можно удалить с помощью:
Исходный PATH содержит как нулевые записи, так и дубликаты для целей тестирования:
Нулевые пути были удалены, но все еще имеют дубликаты, например, (1, 3) и (13, 20):
И наконец, обманщики были удалены:
источник
источник