2009-08-21 11 views
9

Mam dane pobierane naiwnie z list zależności.Jak mogę filtrować elementy z listy w Pythonie?

Wymaga: foo bar baz> = 5,2

I skończyć z

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

Nie chcę się numeryczne i argumentów.

W Perl bym

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

ale nie mogę znaleźć sposób na przykład przekazać remove() a lambda, lub coś takiego.

Najbliżej Doszedłem jest brzydki:

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

który pobiera mi mapę z których wartości z zestawu Chcę ... jeśli kolejność zestawu jest powtarzalny? Wiem, że tak nie jest w przypadku haszy Perla.

Wiem, jak iterować. :) Staram się zrobić to pythonesque właściwy sposób

+0

Spójrz na ten post (co jest rodzajem twojego pytania na odwrocie): http://stackoverflow.com/questions/1112444/perl-equivalent-of-python-list-comprehension/1112462 – Telemachus

+0

Uwaga OT: idiomatyczny sposób testowania dla Brak w Pythonie to "jest". Użyj "item is not None" zamiast "item! = None" –

Odpowiedz

21

Nie potrzeba używać wyrażeń regularnych tutaj str.isalpha i bez listowych...

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 Nie sądzę, że musisz używać rozumienia list do wszystkiego w Pythonie, ale zawsze dostaję frowny oblicze, gdy sugeruję odpowiedzi map lub filter.

+0

+1 za lubienie filtra() ' – RichieHindle

+1

Filtr bez lambda jest A-OK – u0b34a0f6ae

+2

Filtr bez lambda w tym (zaskakująco często) przypadku jest A-OK, o ile nie mieszasz obiektów str i unicode, całe piekło się rozpada Inaczej. – Sufian

1

Jak o

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

który daje tylko te wartości, które chcesz z powrotem w d (kolejność może być inna, ale to cena, jaką płacić za korzystanie z zestawów

+0

match() sprawia, że ​​"^" jest bezużyteczne: re.match ("[a ..."). – EOL

Powiązane problemy