2009-08-14 8 views
7

simple pregunta:¿Hay alguna forma de mostrar los números solo desde una lista de Python?

list_1 = [ 'asdada', 1, 123131.131, 'blaa adaraerada', 0.000001, 34.12451235265, 'stackoverflow is awesome' ] 

Quiero crear una list_2 tal que sólo contiene los números:

list_2 = [ 1, 123131.131, 0.000001, 34.12451235265 ] 

¿Hay manera simplista de hacer esto, o tengo que recurrir a la comprobación de la tipo de variable de cada elemento de la lista y solo muestra los numéricos?

+3

¿Por qué diablos esta pregunta es rechazada? –

+0

Maldición, aquí es cuando desearía poder elegir dos respuestas – dassouki

+0

y ¿por qué está votando tan alto ahora? es un duplicado de muchas preguntas aquí! – SilentGhost

Respuesta

14

Este debería ser el más eficiente y más corto:

import operator 
filter(operator.isNumberType, list_1) 

Editar: esta en python 3000:

import numbers 
[x for x in list_1 if isinstance(x, numbers.Number)] 
+1

no funcionará en py3k – SilentGhost

+0

No uso py3k, pero entonces será simplemente isinstance (x, numbers.Number) en vez de operator.isNumberType) – dalloliogm

+0

ok ... No sé mucho de python 3k, así que he cambiado el ejemplo nuevamente. – dalloliogm

0
filter(lambda n: isinstance(n, int), [1,2,"three"]) 
+0

Para probar varios tipos: filtro (lambda n: isinstance (n, int) o isinstance (n, float), list_of_values) –

+0

quise decir números en general y no solo ints – dassouki

12

Lista de comprensiones.

list_2 = [num for num in list_1 if isinstance(num, (int,float))] 
+0

que funcionó muy bien, gracias: D – dassouki

+0

Puede vale la pena agregar el tipo largo a tu tupla. –

+1

Para mejorar esto, puede usar operator.isNumberType para determinar si un elemento es un número (vea mi otra respuesta, para hacer esto con filtro en lugar de una lista de comprensión). – dalloliogm

0
list_2 = [i for i in list_1 if isinstance(i, (int, float))] 
+3

'isinstance' toma solo 2 argumentos. – SilentGhost

+0

Probablemente significa: list_2 = [i para i en list_1 si esinstance (i, (int, float))] – hughdbrown

2
list_2 = [i for i in list_1 if isinstance(i, (int, float))] 
-1
>>> [ i for i in list_1 if not str(i).replace(" ","").isalpha() ] 
[1, 123131.13099999999, 9.9999999999999995e-07, 34.124512352650001] 
+0

que sería ** muy ** lento – SilentGhost

-1

el cortocircuito de la SilentGhost camino

list_2 = [i for i in list_1 if isinstance(i, (int, float))] 

a

list_2 = [i for i in list_1 if not isinstance(i, str)] 
0

Creo que la forma más fácil es:

[s for s in myList if s.isdigit()] 

espero que ayude!

0

Todas las soluciones propuestas funcionan solo si los números dentro de la lista ya están convertidos al tipo apropiado (int, float).

Me encontré con una lista que viene de la función fetchall de sqlite3. Todos los elementos se formatearon como str, incluso si algunos de esos elementos eran realmente enteros.

cur.execute('SELECT column1 FROM table1 WHERE column2 = ?', (some_condition,)) 
list_of_tuples = cur.fetchall() 

El equivalente de la cuestión sería tener algo como:

list_1 = [ 'asdada', '1', '123131', 'blaa adaraerada', '0', '34', 'stackoverflow is awesome' ] 

Para tal caso, con el fin de obtener una lista con sólo los números enteros, esto es la alternativa que encontré:

list_of_numbers = [] 
for tup in list_of_tuples: 
    try: 
     list_of_numbers.append(int(tup[0])) 
    except ValueError: 
     pass 

list_of_numbers contendrá solo todos los enteros de la lista inicial.

Cuestiones relacionadas