2009-08-21 27 views
9

Ich habe Daten naiv aus Paketabhängigkeitslisten gesammelt.Wie kann ich Elemente aus einer Liste in Python filtern?

Hängt ab: foo bar baz> = 5.2

ich mit

Ende
d = set(['foo','bar','baz','>=','5.2']) 

ich nicht die Numerik wollen und die Operanden.

In Perl würde ich

@new = grep {/^[a-z]+$/} @old 

aber ich nicht einen Weg finden, um z Pass remove() ein Lambda oder etwas.

Der nächstgelegene ich gekommen ist hässlich:

[ item != None for item in [ re.search("^[a-zA-Z]+$",atom) for atom in d] ] 

die mir bekommt eine Karte, welche Werte aus dem Satz Ich will ... wenn die Reihenfolge des Satzes wiederholbar ist? Ich weiß, dass das in Perl-Hashes nicht der Fall ist.

Ich weiß, wie man iteriert. :) Ich versuche es die Pythonesque Right Way

+0

Werfen Sie einen Blick auf diesen Beitrag (was ist Ihre Frage in umgekehrter Reihenfolge): http://stackoverflow.com/questions/1112444/perl-equivalent-of-python-list-comprehension/1112462 – Telemachus

+0

OT Bemerkung: Die idiomatische Methode zum Testen auf Keine in Python ist "ist". Verwenden Sie "item is not None" anstelle von "item! = None" –

Antwort

21

Keine Notwendigkeit für reguläre Ausdrücke hier verwenden str.isalpha Mit und ohne Listenkomprehensionen:...

my_list = ['foo','bar','baz','>=','5.2'] 

# With 
only_words = [token for token in my_list if token.isalpha()] 

# Without 
only_words = filter(str.isalpha, my_list) 

Persona lly Ich glaube nicht, dass Sie ein Listenverständnis für alles in Python verwenden müssen, aber ich bekomme immer ein Stirnrunzeln, wenn ich map oder filter Antworten vorschlage.

+0

+1 für liking 'filter()' – RichieHindle

+1

Filter ohne Lambda ist A-OK – u0b34a0f6ae

+2

Filter ohne Lambda in diesem (überraschend üblichen) Fall ist A-OK, solange man keine Str- und Unicode-Objekte mischt, die Hölle bricht los Andernfalls. – Sufian

1

Wie wäre es

d = set([item for item in d if re.match("^[a-zA-Z]+$",item)]) 

zu tun, dass Sie nur die Werte haben Sie wollen, zurück in d (die Reihenfolge unterschiedlich sein können, aber das ist der Preis, den Sie zahlen für die Verwendung von Sätzen

+0

match() macht "^" unbrauchbar: re.match ("[a ..."). – EOL

Verwandte Themen