2017-02-19 3 views
4

Ich versuche, Python zu lernen. Hier ist der relevante Teil der Übung:Hinzufügen von eindeutigen Werten zu einer Liste in Python

Überprüfen Sie für jedes Wort, ob das Wort bereits in einer Liste ist. Wenn das Wort nicht in der Liste enthalten ist, fügen Sie es der Liste hinzu.

Hier ist, was ich habe.

Hier ist, was ich bekomme.

['Arise', 'But', 'It', 'Juliet', 'Who', 'already', 'and', 'and', 'and', 'breaks', 'east', 'envious', 'fair', 'grief', 'is', 'is', 'is', 'kill', 'light', 'moon', 'pale', 'sick', 'soft', 'sun', 'sun', 'the', 'the', 'the', 'through', 'what', 'window', 'with', 'yonder']

Hinweis Vervielfältigung (und ist, Sonne, usw.).

Wie bekomme ich nur eindeutige Werte?

+3

Der idiomatische Weg besteht darin, einen * Satz * von Wörtern zu erhalten, gegen die geprüft werden soll. All diese linearen Scans über eine wachsende Liste führen dazu, dass ein ansonsten linearer Algorithmus zu quadratisch degradiert wird. –

Antwort

8

Verwenden Sie dies.

if word not in output: 
     output.append(word) 
6

Statt is not Betreiber sollten Sie not in Operator zu prüfen, ob der Eintrag in der Liste ist:

if word not in output: 

BTW, mit set viel effizienter ist (siehe Time complexity):

with open('romeo.txt') as fhand: 
    output = set() 
    for line in fhand: 
     words = line.split() 
     output.update(words) 

UPDATE Die set behält nicht die ursprüngliche Reihenfolge bei. Verwenden Sie das Set als Hilfsdatenstruktur, um den Auftrag beizubehalten:

+0

danke Jungs. Ich schätze die Hilfe –

+1

Die Übung fordert eine Liste, wo die Wörter in der Reihenfolge ihres ersten Auftretens geordnet werden, also sehe ich nicht, wie 'set()' * die Liste ersetzen könnte, obwohl es eindeutig wäre eine hilfreiche Hilfsdatenstruktur. –

+0

@ JohnColeman, Danke für den Kommentar. Ich dachte es ist egal, weil OP am Ende des Codes 'sortiert' hat. Ich werde die Antwort aktualisieren, um die Version einzuschließen, die die Bestellung bewahrt. – falsetru

1

Hier ist ein „one-liner“, die this implementation der Entfernung von Duplikaten verwendet, während um die Erhaltung:

def unique(seq): 
    seen = set() 
    seen_add = seen.add 
    return [x for x in seq if not (x in seen or seen_add(x))] 

output = unique([word for line in fhand for word in line.split()]) 

Die letzte Zeile flacht fhand in eine Liste von Wörtern, und ruft dann unique() auf der Ergebnisliste .

Verwandte Themen