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