2012-03-31 20 views
1

Gibt es in Python eine Möglichkeit, nach doppelten Objekten in einer Liste zu suchen, und wenn ja, entfernen Sie sie? Ich suche nach etwas in der Art:Python - Suchen und zerstören Sie doppelte Objekte in einer Liste

>>> def check(): 
>>> # put code here 
>>> list = ["foo", "foo", "bar"] 
>>> check(list) 
>>> list 
["foo", "bar"] 
>>> list2 = ["foo", "bar", "example"] 
>>> check(list2) 
>>> list2 
["foo", "bar", "example"] 

Vielen Dank im Voraus!

Update:

Jungs, sie ist bei der Programmierung wirklich neu, und die Reihenfolge ist nicht wirklich wichtig. So sollte eine for Schleife in Ordnung sein. Aber trotzdem danke!

Antwort

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

TYSM! Du bist ein Lebensretter! – bladezzz

5

Eine set könnte hier eine bessere Datenstruktur sein, da sie in erster Linie keine Duplikate haben kann. Sie können auch als Werkzeug benutzen, um Ihre Liste uniquify:

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

Oder wenn Sie den Auftrag zu erhalten, müssen Sie Ihre Daten in einem OrderedDict halten können:

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

Beachten Sie, dass aus Gründen der Performance Es wäre besser, zuerst die richtige Datenstruktur zu verwenden, anstatt eine rohe Liste zu verwenden und nach jeder Operation mit einer dieser Transformationen Duplikate daraus zu entfernen.

+0

Viel besser. In Python 2 ist es nur 'd.keys()' und wenn ein 'dictview' funktioniert (was normalerweise ein' tuple' ist), können Sie das selbe für Python 3 verwenden. – agf

+0

@agf: Ich sehe was nicht Du meinst mit "wird normalerweise wo ein Tupel sein würde". 'KeysView' unterstützt nicht einmal die Indizierung. –

+0

Ich habe versucht zu implizieren, dass Sie es nicht selbst mutieren können, aber Sie können darüber iterieren, und es hat eine 'len' - dass es ein unveränderbarer iterabler Container ist. Ein Tupel war kein gutes Beispiel :) – agf

0

Diese IDLE-Sitzung zeigt eine praktische Python-Methode zum Entfernen doppelter Elemente durch Konvertierung in eine Gruppe, in der Duplikate durch Konvertierung entfernt werden.

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

Wenn Sie die Reihenfolge in der Liste behalten müssen:

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

Wenn v in s noch nicht ist, dann s.add(v) ausgewertet und gibt keine, so dass der Wert genommen wird. Andernfalls ist v in s True und der Wert wird übersprungen.

Wenn Ihnen die Bestellung egal ist, verwenden Sie einfach set() wie bereits empfohlen.

0

Wenn Python mit> 2,4

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

myList = sorted(set(myList))

Ausgabe

['bar', 'foo']

Verwandte Themen