2017-12-19 6 views
4
source=[1,2,3,4,2,3,5,6] 

dst=[] 
for item in source: 
    if item not in dst: 
     dst.append(item) 

print(dst) # [1,2,3,4,5,6] 

Kann ich Code über so etwas wie dies zu vereinfachen:"für" Schleife und "if" Bedingung für die Listenerstellung in Python

dst=[item for item in [1,2,3,4,2,3,5,6] if item not in 'this array'] 

Dank

+3

Nein, da du im Vorfeld keine Referenz auf "dieses" Array hast. Außerdem kann dieser Eindeutigkeitsfilter verbessert werden, falls die Artikel waschbar sind. –

+2

können Sie einfach 'set()' dafür verwenden. Sie erhalten nur alle einzigartigen Artikel – Gahan

+1

@Gahan: nicht per se, da ein 'set' die Reihenfolge ändern kann. –

Antwort

5

Ein Set ist wahrscheinlich das, was Sie suchen, da Sie nicht auf dieses Array beziehen kann, während es erstellt wird ist:

>>> source = [1,2,3,4,2,3,5,6] 
>>> set(source) 
{1, 2, 3, 4, 5, 6} 

Wenn Sie Original halten möchten, können allerdings halten, Sie verfolgen von dem, was Sie bereits zu dst mit einem Satz hinzugefügt (seen):

>>> source = [1,2,3,4,2,3,5,6] 
>>> seen = set() 
>>> dst = [] 
>>> for i in source: 
>>>  if i not in seen: 
>>>   dst.append(i) 
>>>   seen.add(i) 
>>> 
>>> dst 
[1, 2, 3, 4, 5, 6] 
+1

Nicht diese Sets sind ungeordnet und können Ihre ursprüngliche Bestellung verlieren (tatsächlich ist es ein Implementierungsunfall, dass sie manchmal nicht verloren gehen). –

+0

@brunodesthuilliers guter Punkt. Ich habe die Lösung um einen Ansatz ergänzt, der die ursprüngliche Reihenfolge berücksichtigt. – grovina

+0

Liste (set (Quelle)) - schnellste Art und Weise :) –

6

Nein, Comprehensions Liste können nicht selbstbezogen sein .

Sie scheinen Duplikate aus einer Liste entfernen zu wollen. Siehe this und this Fragen für eine Bootsladung von Ansätzen für dieses Problem.

0

bei Verwendung, wenn und ist Ihre Anforderung Wie wäre das?

[dst.append(item) for item in source if item not in dst] 
3

Sie nicht dst aus der Liste Verständnis verweisen können, aber Sie können das aktuelle Element überprüfen gegen die zuvor iterativ Artikel in source, indem sie es bei jeder Iteration Slicing:

source = [1, 2, 3, 4, 2, 3, 5, 6] 
dst = [item for i, item in enumerate(source) 
     if item not in source[0:i]] 

print(dst) # [1, 2, 3, 4, 5, 6] 
0

Well statt Erstellen neue Listen Sie Ihre bestehende Liste mit Liste Verständnis wie unten gezeigt ändern können: Sie können

In [1]: source 
Out[1]: [1, 9, 2, 5, 6, 6, 4, 1, 4, 11] 

In [2]: [ source.pop(i) for i in range(len(source))[::-1] if source.count(source[i]) > 1 ] 
Out[2]: [4, 1, 6] 

In [3]: source 
Out[3]: [1, 9, 2, 5, 6, 4, 11] 

als weiteren Ansatz f erhalte zuerst eine eindeutige Liste mit set und sortiere sie dann mit Bezug auf den Quellindexwert wie folgt:

source = [1, 9, 2, 5, 6, 6, 4, 1, 4, 11] 
d = list(set(source)) 
d.sort(key=source.index) 
print(d) # [1, 9, 2, 5, 6, 4, 11]