2015-08-26 2 views
1

Мне нужно удалить значения дубликатов в списке, но с set() или for ... if not in... loop Я принимаю только правильные решения. Например, для ['asd', 'dsa', 1, '1', 1.0]Python удаляет дубликаты в списке и 1 == 1.0 True

я получаю:

['asd', 'dsa', 1, '1'] 

но необходимый результат:

['asd', 'dsa', 1, '1', 1.0] 

Как я могу добиться этого?

+0

Это на самом деле не является дубликатом предыдущий вопрос, который был конкретно посвящен наборам, тогда как здесь OP хочет сделать список уникальным (для конкретного определения уникального) без очевидных ограничений на реализацию. Также обратите внимание, что ответ на предыдущий вопрос не помогает OP вообще. – user4815162342

ответ

2

Вы можете попробовать

In [3]: [value for _, value in frozenset((type(x), x) for x in l)] 
Out[3]: [1.0, '1', 1, 'dsa', 'asd'] 

Мы создаем (временный) frozenset кортежей, содержащих как элемент и его тип - сохранить элементы, которые равны (например, , 1,0 и Правда), но имеют разные типы. Затем мы перебираем его, распаковываем кортежи и извлекаем элементы (value).

Несомненно, мы могли бы использовать обычный set, который является изменяемым, но нам не нужна изменчивость, потому что наш набор является временным.

Обратите внимание, что это не обязательно сохранит первоначальный заказ.


Если вам нужен оригинальный заказ сохранившийся, используйте collections.OrderedDict, который является хэш-карта (так же как обычный dict) и, следовательно, работает аналогично frozenset/set

In [16]: from collections import OrderedDict 

In [17]: [value for _, value in OrderedDict.fromkeys((type(x), x) for x in l)] 
Out[17]: ['asd', 'dsa', 1, '1', 1.0] 
+0

Это не так много: 'hash ((int, 1))! = Hash ((float, 1.0))', но that '(int, 1)! = (Float, 1.0)'. –

+0

@MarkRansom Я попытался изменить его – vaultah

2

Это хороший случай для decorate-sort-undecorate pattern с сортировкой частью модифицированной просто создать набор:

dest = [el for el, ignore 
     in set((x, type(x)) 
       for x in src)] 

Стадия украшения добавляет тип элемента в набор, так что, например, 1 и 1.0 сравнивают разные. Окончательный список затем получается путем декомпозиции набора, т. Е. Удаления ненужных объектов типа.

Смежные вопросы