2009-05-04 23 views

Respuesta

41
changed_list = [int(f) if f.isdigit() else f for f in original_list] 
+3

Un elegante delineador. Contempla el poder de las listas de comprensión. – mkClark

+0

estaba pensando en líneas similares – Nope

+0

buena solución, pero ¿qué pasa si la lista también tiene valores flotantes '['promedio de bateo', '306', 'ERA', '1710.5'] ' –

5

Parece que los datos sabrán en qué posiciones se supone que deben estar los números. En este caso es probable que sea mejor para convertir explícitamente los datos en estas posiciones en lugar de simplemente convertir cualquier cosa que se parece a un número:

ls = ['batting average', '306', 'ERA', '1710'] 
ls[1] = int(ls[1]) 
ls[3] = int(ls[3]) 
+0

Sí esta es la mejor solución para el caso estático, mientras que la de Alex es la mejor para el caso dinámico. – Unknown

5

Prueba esto:

def convert(someList): 
    for item in someList: 
     try: 
      yield int(item) 
     except ValueError: 
      yield item 

newList= list(convert(oldList)) 
0
a= ['batting average', '306', 'ERA', '1710.5'] 

[f if sum([c.isalpha() for c in f]) else float(f) for f in a ] 

si la lista contiene flotador , cadena e int (según lo señalado por @ d.putto en el comentario)

+1

'suma ([c.isalpha() para c en f])' es una manera bastante subóptima de verificar "si cualquier carácter en f es alfabético" - prueba 'any (c.isalpha() para c en f) 'para una mejor legibilidad y rendimiento. Por supuesto, ambos fallarán si 'f' es igual a, por ejemplo' '!' '- una cadena que no es un número pero no tiene caracteres alfanuméricos - y tampoco se puede convertir, por ejemplo,' '1.7e3'' - una cadena que contiene un carácter alfanumérico pero, sin embargo, sería perfectamente correcto pasar como argumento a 'float' (" notación exponencial "). –

+0

cierto. buen punto ... publicado solo para responder al ejemplo artificial específico de d.putto. Debería haber pensado más antes de publicar mi respuesta medio horneada! –

Cuestiones relacionadas