2012-03-31 3 views
1

В Python есть ли способ проверить дублирующиеся элементы в списке, а если есть, то удалить их? Я ищу что-то вроде этого:Python - найти и уничтожить повторяющиеся элементы в списке

Заранее благодарен!

Update:

Ребята, я действительно новичок в программировании, и порядок не имеет значения. Таким образом, цикл for должен быть точным. Но спасибо в любом случае!

ответ

2
>>>lis = ["foo", "foo", "bar"] 
>>>lis=list(set(lis)) 
>>>print(lis) 
['foo','bar'] 
+0

TYSM! Ты спасатель! – bladezzz

5

А set может быть лучшей структурой данных здесь, поскольку он не может иметь дубликаты в первую очередь. Вы можете также использовать его в качестве инструмента для uniquify списка:

>>> lst = ["bar", "foo", "foo"] 
>>> set(lst) 
set(['foo', 'bar']) 
>>> list(set(lst)) 
['foo', 'bar'] 

Или, если вам нужно сохранить порядок, вы можете сохранить ваши данные в OrderedDict:

>>> from collections import OrderedDict 
>>> d = OrderedDict.fromkeys(lst) 
>>> d 
OrderedDict([('bar', None), ('foo', None)]) 
>>> list(d) 
['bar', 'foo'] 

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

+0

Намного лучше. На Python 2 это просто 'd.keys()', и если работает 'dictview' (который обычно будет содержать' tuple'), вы можете использовать его на Python 3. – agf

+0

@agf: я не вижу, что вы подразумеваете под «обычно будет, где кортеж будет». 'KeysView' даже не поддерживает индексирование. –

+0

Я пытался предположить, что вы не можете самостоятельно его мутировать, но вы можете перебирать его, и он имеет «len», что это неизменяемый итерируемый контейнер. Кортеж не был хорошим примером :) – agf

0

Это IDLE сеанс покажет удобный способ Python для удаления повторяющихся элементов путем преобразования в наборе, где дубликаты удаляются путем преобразования.

>>>lis = ["foo", "foo", "bar"] 
>>>list(set(lis)) 
2

Если вам нужно сохранить порядок в списке:

s = set() 
new_list = [v for v in old_list if not (v in s or s.add(v))] 

Если v еще не s, то s.add(v) вычисляется и возвращает None, так что значение берется. В противном случае v in s имеет значение True, а значение пропускается.

Если вы не заботитесь о заказе, просто используйте set(), как уже было рекомендовано.

0

При использовании питона> 2,4

mylist = ["foo", "foo", "bar"]

myList = sorted(set(myList))

Выход

['bar', 'foo']

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