2009-08-21 15 views
9

Tengo datos recopilados ingenuamente de listas de dependencia de paquetes.¿Cómo puedo filtrar elementos de una lista en Python?

Depende: foo bar baz> = 5.2

termino con

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

no quiero que los valores numéricos y los operandos.

En Perl Me

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

pero no puedo encontrar una manera de ejemplo, pasar remove() una lambda, o algo.

Lo más cerca que he llegado es feo:

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

que me consigue un mapa de qué valores del conjunto que quiero ... si el orden del conjunto es repetible? Sé que ese no es el caso en los hashes de Perl.

Sé cómo iterar. :) Estoy tratando de hacerlo de la manera correcta Pythonesque

+0

Eche un vistazo a esta publicación (que es su tipo de pregunta al revés): http://stackoverflow.com/questions/1112444/perl-equivalent-of-python-list-comprehension/1112462 – Telemachus

+0

OT observación: El La forma idiomática de probar None en Python es "is". Use "item is not none" en lugar de "item! = None" –

Respuesta

21

No hay necesidad de expresiones regulares aquí Utilice str.isalpha Con y sin listas por comprensión:...

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 No creo que tengas que usar una lista de comprensión para todo en Python, pero siempre me pongo frowny-faced cuando sugiero map o filter respuestas.

+0

+1 por gusto 'filter()' – RichieHindle

+1

El filtro sin lambda es A-OK – u0b34a0f6ae

+2

El filtro sin lambda en esta (sorprendentemente común) carcasa es A-OK siempre y cuando no estés mezclando objetos unicode y str, se desata el infierno. de otra manera. – Sufian

1

¿Qué tal

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

que le da sólo los valores que desee, de vuelta en d (el orden puede ser diferente, pero ese es el precio que se pagar utilizando conjuntos

+0

match() hace que el "^" sea inútil: re.match ("[a ..."). – EOL

Cuestiones relacionadas