Как удалить дубликаты из списка Python и сохранить порядок?

Учитывая список строк, я хочу отсортировать его по алфавиту и удалить дубликаты. Я знаю, что могу это сделать:

from sets import Set
[...]
myHash = Set(myList)

но я не знаю, как извлечь элементы списка из хэша в алфавитном порядке.

Я не женат на хеше, поэтому любой способ добиться этого будет работать. Кроме того, производительность не является проблемой, поэтому я предпочел бы, чтобы решение, явно выраженное в коде, было быстрым, но более непрозрачным.

Ответ 1

Список можно сортировать и дедуплицировать с помощью встроенных функций:

myList = sorted(set(myList))
  • set - это встроенная функция для Python >= 2.3
  • sorted - встроенная функция для Python >= 2.4

Ответ 2

Если ваш вход уже отсортирован, тогда может быть более простой способ сделать это:

from operator import itemgetter
from itertools import groupby
unique_list = list(map(itemgetter(0), groupby(yourList)))

Ответ 3

Если вы хотите сохранить порядок исходного списка, просто используйте OrderedDict с None как значения.

В Python2:

    from collections import OrderedDict
    from itertools import izip, repeat

    unique_list = list(OrderedDict(izip(my_list, repeat(None))))

В Python3 это еще проще:

    from collections import OrderedDict
    from itertools import repeat

    unique_list = list(OrderedDict(zip(my_list, repeat(None))))

Если вам не нравятся итераторы (zip и repeat), вы можете использовать генератор (работает как в 2, так и 3):

    from collections import OrderedDict
    unique_list = list(OrderedDict((element, None) for element in my_list))

Ответ 4

Если это ясность вы после, а не скорость, я думаю, что это очень ясно:

def sortAndUniq(input):
  output = []
  for x in input:
    if x not in output:
      output.append(x)
  output.sort()
  return output

Это O (n ^ 2), хотя при повторном использовании не для каждого элемента входного списка.

Ответ 5

> но я не знаю, как получить элементы списка из хэша в алфавитном порядке.

Не совсем ваш главный вопрос, но для дальнейшего использования Rod ответ с помощью sorted можно использовать для перемещения ключей dict в отсортированном порядке:

for key in sorted(my_dict.keys()):
   print key, my_dict[key]
   ...

а также потому, что tuple упорядочивается первым членом кортежа, вы можете сделать то же самое с items:

for key, val in sorted(my_dict.items()):
    print key, val
    ...

Ответ 6

Для строковых данных

 output = []

     def uniq(input):
         if input not in output:
            output.append(input)
 print output