2016-03-30 7 views
2

Tor: eine bedingte Anweisung in einer Liste Verständnis erstellen, dass (1) dynamisch Tests - dh bei jeder Iteration - wenn das Element nicht in der Liste enthalten ist erfaßt werden können gegeben (2) wird die Liste selbst bei jeder Iteration aktualisiert.Dynamische selbst verweis bedingt in Liste Verständnis

Background-Code:

arr = [2, 2, 4] 
l = list() 

gewünschter Ausgang:

l = [2, 4] 

gewünschtes Verhalten über for-Schleife:

for element in arr: 
     if element not in l: 
      l.append(element) 

Falsche Liste Verständnis nicht Erzeugungs gewünschtes Verhalten:

l = [element for element in arr if element not in l] 

Frage angepasst: Wie behebe ich die Liste Verständnis, so dass sie das gewünschte Verhalten erzeugt, das heißt, der gewünschte Ausgang oben angegeben?

+1

Sie können nicht die gleiche Liste ändern Sie machen das Verständnis in –

+0

Müssen Sie ein Listenverständnis dafür verwenden? Ist ein Set in Ordnung? –

+0

Wenn Sie das Duplikat einfach entfernen möchten, sollten Sie sich http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in-python-whilst- ansehen. Konserven-Reihenfolge – SwiftsNamesake

Antwort

0

Wenn Sie unbedingt eine Listenkomprehension verwenden müssen, können Sie einfach Ihre for Schleife in eine umwandeln. Der Nachteil ist, dass Sie mit einer Liste von None Elemente werden am Ende, denn das ist, was list.append kehrt:

>>> arr = [2, 2, 4] 
>>> l = list() 
>>> _ = [l.append(element) for element in arr if element not in l] 
>>> print(l) 
[2, 4] 
>>> print(_) 
[None, None] 

Wenn Sie Comprehensions gebunden sind, aber nicht unbedingt Comprehensions auflistet, können Sie den Generator Verständnis verwenden vorgeschlagen von @tdelaney. Dies erzeugt keine unerwünschten Nebenprodukte und wird genau das tun, was Sie wollen.

Ein besserer Weg als beide wäre wahrscheinlich, die ursprüngliche Liste in ein Set und dann zurück in eine Liste zu setzen. Der Vorteil der Verwendung eines Satzes zum Erweitern einer Liste besteht darin, dass Sätze beim Hinzufügen von Elementen nach der Überprüfung auf eine vorherige Eingrenzung wesentlich schneller sind. Eine Liste muss eine lineare Suche durchführen und jedes Mal neu zuweisen, wenn Sie ein Element hinzufügen.

>>> l = list(set(arr))