2009-05-04 37 views

risposta

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

Un elegante liner. Guarda il potere della comprensione delle liste. – mkClark

+0

stava pensando su linee simili – Nope

+0

buona soluzione ma cosa succede se lista ha valori float anche '['batting average', '306', 'ERA', '1710.5']' –

5

I dati sembrano come dovresti sapere in quali posizioni dovrebbero essere i numeri. In questo caso è probabilmente meglio per convertire in modo esplicito i dati a queste posizioni invece di convertire qualsiasi cosa che assomiglia a un numero:

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

Yep questa è la soluzione migliore per il caso statico, mentre Alex è il migliore per il caso dinamico. – Unknown

5

Prova questo:

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 ] 

se l'elenco contiene galleggiante , string e int (come indicato da @ d.putto nel commento)

+1

'sum ([c.isalpha() per c in f])' è un modo abbastanza sub-ottimale per verificare "se un carattere in f è alfabetico" - prova 'any (c.isalpha() per c in f) 'per migliorare la leggibilità e le prestazioni. Naturalmente, entrambi falliranno se 'f' è uguale a' '! '' - una stringa che non è un numero ma che non ha caratteri alfanumerici - e inoltre non riesce a convertire ad esempio '' 1.7e3'' - una stringa che contiene un char alfanumerico, ma sarebbe comunque perfetto per passare come argomento a 'float' (" notazione esponenziale "). –

+0

vero. buon punto ... pubblicato solo per rispondere all'esempio forzato specifico di d.putto. Avrei dovuto riflettere prima di postare la mia risposta a metà! –

Problemi correlati