it-swarm.com.ru

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

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

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

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

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

71
Josh Glover

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

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

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

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

Если вы хотите сохранить порядок исходного списка, просто используйте 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
Paweł Sobkowiak

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

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

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

2
unwind

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

Не совсем ваш главный вопрос, но для дальнейшего использования ответ Рода, использующий 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
    ...
1
davidavr

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

 output = []

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