2010-07-01 15 views
6

Solo soy un principiante en python y quiero saber si es posible eliminar todos los valores enteros de una lista? Por ejemplo, el documento dice asíCómo eliminar todos los valores enteros de una lista en python

['1','introduction','to','molecular','8','the','learning','module','5'] 

Después de la eliminación Quiero que el documento se vea como:

['introduction','to','molecular','the','learning','module'] 

Respuesta

20

Para eliminar todos los números enteros, hacer esto:

no_integers = [x for x in mylist if not isinstance(x, int)] 

Sin embargo, el ejemplo la lista en realidad no contiene enteros. Contiene solo cadenas, algunas de las cuales están compuestas solo de dígitos. Para filtrar los cabo, haga lo siguiente:

no_integers = [x for x in mylist if not (x.isdigit() 
             or x[0] == '-' and x[1:].isdigit())] 

alternativa:

is_integer = lambda s: s.isdigit() or (x[0] == '-' and x[1:].isdigit()) 
no_integers = filter(is_integer, mylist) 
+0

si desea modificar la lista en contexto en lugar de crear una lista, esto se puede hacer con el lazo simple. – tlayton

+1

El número es negativo. Isdigit() no funcionará. – razpeitia

+0

@mykhal Solo mirando, ¿es eso una broma? Funciona en números de varios dígitos, por supuesto – JAL

8

Ninguno de los elementos de la lista son números enteros. Son cadenas que contienen solo dígitos. Entonces puede usar el método de cadena isdigit para filtrar estos elementos.

items = ['1','introduction','to','molecular','8','the','learning','module','5'] 

new_items = [item for item in items if not item.isdigit()] 

print new_items 

Enlace a la documentación: http://docs.python.org/library/stdtypes.html#str.isdigit

11

usted puede hacer esto, también:

def int_filter(someList): 
    for v in someList: 
     try: 
      int(v) 
      continue # Skip these 
     except ValueError: 
      yield v # Keep these 

list(int_filter(items)) 

¿Por qué? Porque int es mejor que tratar de escribir reglas o expresiones regulares para reconocer valores de cadena que codifican un número entero.

+0

¿Por qué es 'int' mejor que' str.isdigit'? –

+5

Como han señalado otros, ''-2'.isdigit()' devolverá 'False'. –

+0

+1. Consulte http://stackoverflow.com/questions/354038/checking-if-string-is-a-number-python para una discusión (con 'float', pero igual de relevante). – Brian

0

Por favor, no use esta forma para eliminar elementos de una lista: (editado tras las observaciones de THC4k)

>>> li = ['1','introduction','to','molecular','8','the','learning','module','5'] 
>>> for item in li: 
     if item.isdigit(): 
      li.remove(item) 

>>> print li 
['introduction', 'to', 'molecular', 'the', 'learning', 'module'] 

Esto no funcionará ya que el cambio de una lista, mientras que la iteración en que confundirá al bucle de. Además, item.isdigit() no funcionará si el elemento es una cadena que contiene un entero negativo, como lo señala razpeitia.

+0

Python realmente necesita un mecanismo para evitar que las personas lo hagan. Parece que funcionaría, pero no es así - prueba con 'li = ['iterating + removing -> skipping', '4', '5', 'see?']' (Al eliminar 4 se omitirá el 5, entonces permanece en la lista) –

1

También puede utilizar lambdas (y, obviamente, la recursividad), para lograr que (Python 3 es necesario):

isNumber = lambda s: False if (not(s[0].isdigit()) and s[0]!='+' and s[0]!='-') else isNumberBody(s[ 1:]) 

isNumberBody = lambda s: True if len(s) == 0 else (False if (not(s[0].isdigit()) and s[0]!='.') else isNumberBody(s[ 1:])) 

removeNumbers = lambda s: [] if len(s) == 0 else (([s[0]] + removeNumbers(s[1:])) if (not(isInteger(s[0]))) else [] + removeNumbers(s[ 1:])) 

l = removeNumbers(["hello", "-1", "2", "world", "+23.45"]) 
print(l) 

Resultado (que aparece en 'L') será: [ 'hola', 'mundo']

+0

Esto no funciona con números negativos. – JAL

+0

Bueno, sí, pero sería trivial cambiar ese código para lograr ese comportamiento. – Baltasarq

+0

Hecho, ahora maneja números negativos. – Baltasarq

3

Personalmente me gusta el filtro. Creo que puede ayudar a mantener un código legible y conceptualmente simple si se utiliza de una manera juiciosa:

x = ['1','introduction','to','molecular','8','the','learning','module','5'] 
x = filter(lambda i: not str.isdigit(i), x) 

o

from itertools import ifilterfalse 
x = ifilterfalse(str.isdigit, x) 

Nota el segundo devuelve un iterador.

0

Puede usar el filter incorporado para obtener una copia filtrada de una lista.

>>> the_list = ['1','introduction','to','molecular',-8,'the','learning','module',5L] 
>>> the_list = filter(lambda s: not str(s).lstrip('-').isdigit(), the_list) 
>>> the_list 
['introduction', 'to', 'molecular', 'the', 'learning', 'module'] 

Lo anterior puede manejar una variedad de objetos mediante el uso de conversión de tipos explícita.Dado que casi todos los objetos de Python se pueden convertir legalmente a una cadena, aquí filter toma una copia str-converted para cada miembro de la lista, y verifica si la cadena (menos cualquier carácter '-') es un dígito numérico. Si es así, el miembro se excluye de la copia devuelta.

The built-in functions are very useful. Cada una de ellas está altamente optimizada para las tareas que están diseñadas para manejar, y le evitarán reinventar soluciones.

0

Para eliminar todos los números enteros de la lista

ls = ['1','introduction','to','molecular','8','the','learning','module','5'] 
ls_alpha = [i for i in ls if not i.isdigit()] 
print(ls_alpha) 
Cuestiones relacionadas