Самый быстрый способ унифицировать список в Python без сохранения порядка? Я видел много сложных решений в Интернете - могли ли они быть быстрее, чем просто:
list(set([a,b,c,a]))
Самый быстрый способ унифицировать список в Python без сохранения порядка? Я видел много сложных решений в Интернете - могли ли они быть быстрее, чем просто:
list(set([a,b,c,a]))
set([a, b, c, a])
Оставьте его в этой форме, если это возможно.
Переход в набор работает только для списков, так что все их элементы хешируются - так, например, в вашем примере, если c = []
, код, который вы укажете, вызовет исключение. Для не-хешируемых, но сопоставимых элементов сортировка списка, а затем использование itertools.groupby
для извлечения уникальных элементов из него - лучшее доступное решение (O (N log N)). Если элементы не являются ни хешируемыми, ни сопоставимыми, ваше единственное решение "последнего канава" O(N squared)
.
Вы можете запрограммировать функцию "uniquify" любого списка, который использует наилучший доступный подход, используя каждый подход в порядке, с try
/except
вокруг первого и второго (и a return
результата либо в конце предложения try
, либо, элегантно, в предложении else
оператора try
; -).
Тим Петерс написал классическую общую для этой проблемы еще в 2001 году (до того, как были введены комплекты), Комментарии Alex Martelli, Raymond Hettinger и другие являются информативными и включают обновление для использования наборов и т.д.
Отметьте этот пост с множеством разных результатов. То, что вы предложили выше, похоже, является одним из самых быстрых (и самых простых)
Этот обновленный пост от Peter Bengtsson предлагает два из самых быстрых способов составить список уникальных элементов в Python 3.6+:
# Unordered (hashable items)
list(set(seq))
# Order preserving
list(dict.fromkeys(seq))