Как удалить дубликаты из списка Python и поддерживать порядок? [дубликат]
этот вопрос уже есть ответ здесь:
Как удалить дубликаты из списка при сохранении порядка?
28 ответов
учитывая список строк, я хочу отсортировать его в алфавитном порядке и удалить дубликаты. Я знаю, что могу сделать это:
from sets import Set
[...]
myHash = Set(myList)
но я не знаю как получить список членов из хэша алфавитный порядок.
Я не женат на хэше, поэтому любой способ добиться этого будет работать. Кроме того, производительность не является проблемой, поэтому я бы предпочел решение, которое четко выражено в коде, быстрому, но более непрозрачному.
6 ответов:
если входные данные уже отсортированы, то может быть более простой способ сделать это:
from operator import itemgetter from itertools import groupby unique_list = list(map(itemgetter(0), groupby(yourList)))
если вы хотите сохранить порядок исходного списка, просто используйте 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))
Если вам нужна ясность, а не скорость, я думаю, что это очень ясно:
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 для каждого элемента входного списка.
> но я не знаю как получить список членов из хэша в алфавитном порядке.
на самом деле не ваш главный вопрос, но для ответа на будущий запрос стержня с помощью
sortedможет использоваться для обхода adictключи в отсортированном порядке:for key in sorted(my_dict.keys()): print key, my_dict[key] ...и так
tuple' s упорядочиваются первым членом кортежа, вы можете сделать то же самое сitems:for key, val in sorted(my_dict.items()): print key, val ...
для строковых данных
output = [] def uniq(input): if input not in output: output.append(input) print output
Comments