У меня периодически всплывает вопрос: как в Питоне удалить в списке дублирующиеся элементы (из [1, 2, 2, 3] получить [1, 2, 3]). Я знаю один способ-хак:
lst = dict([(item, None) for item in lst]).keys()
Здесь создается словарь из элементов списка в качестве ключей. Поскольку ключи в словаре уникальные, добавление дублирующих ключей ничего не меняет. Ну и потом просто берется получившийся список ключей словаря.
Я его назвал хаком, потому что он использует, в общем-то, побочный эффект от совершенно бесполезного преобразования данных, и при чтении кода это сразу не транслируется мозгом в "удалить дубликаты". Не говоря уж о том, что данные эти несколько раз копируются.
Так вот, не знает ли кто какой-нибудь способ поэлегантней?
Комментарии: 8
3.10.06 23:47
тут: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
способ все тот же в целом... ну и коменты рулят...
4.10.06 00:21
Почему бы не воспользоваться set:
lst = set(lst)
или:
lst = list(set(lst))
Работает только в python >=2.4, если я не ошибаюсь.
4.10.06 01:19
О, множества -- это интересно! Спасибо.
Хотя тоже вариант не на все случаи, потому что порядок не схраняют. Как, впрочем, и способ через dict.
4.10.06 08:55
Python Cookbook от О'Рейли - неплохая книженция.
В частности, там есть рецепты по удалению дубликатов из списков. Далее код.
Порядок не сохраняется:
Порядок сохраняется:
4.10.06 11:16
9.10.06 11:24
Если порядок не важен, то set. Если важен, то словарь + your_list.index()
26.04.07 00:14
А попробуйте вот это :)
lst2=reduce(lambda l,i: l if i in l else l+[i],lst,[])
26.04.07 01:15
Или так (наверное, побыстрее будет):
result=[v for i,v in enumerate(src_lst) if v not in src_lst[:i]]