Самый быстрый способ унифицировать список в Python - PullRequest
21 голосов
/ 27 марта 2010

Самый быстрый способ унифицировать список в Python без сохранения порядка?Я видел много сложных решений в Интернете - они могли бы быть быстрее, чем просто:

list(set([a,b,c,a]))

Ответы [ 5 ]

26 голосов
/ 27 марта 2010

Переход к набору работает только для списков, так что все их элементы могут быть изменены - например, в вашем примере, если c = [], код, который вы дадите, вызовет исключение. Для не хешируемых, но сопоставимых элементов, наилучшим доступным решением является сортировка списка с последующим использованием itertools.groupby для извлечения из него уникальных элементов (O (N log N)). Если элементы не являются ни хешируемыми, ни сопоставимыми, ваше единственное решение «последней канавы» - O(N squared).

Вы можете закодировать функцию для «унификации» любого списка, который использует наилучший доступный подход, попробовав каждый подход по порядку, с try / except вокруг первого и второго (и return результата либо в конце предложения try, либо, элегантно, в предложении else оператора try; -).

23 голосов
/ 27 марта 2010
set([a, b, c, a])

Оставьте это в этой форме, если это возможно.

3 голосов
/ 27 марта 2010

Тим Питерс написал классический общий рецепт поваренной книги для этой проблемы еще в 2001 году (до появления наборов). Комментарии Алекса Мартелли, Раймона Хеттингера и др. Носят информативный характер и включают обновление для использования наборов и т. Д.

1 голос
/ 29 декабря 2017

Это обновленное сообщение Питера Бенгтссона предлагает два самых быстрых способа составить список уникальных предметов в Python 3.6+:

# Unordered (hashable items)
list(set(seq))

# Order preserving
list(dict.fromkeys(seq))
0 голосов
/ 27 марта 2010

Проверьте этот пост со многими различными результатами. То, что вы предложили выше, кажется одним из самых быстрых (и самых простых)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...