2012-10-19 7 views
5

Dire che ho una lista come questa:lista convertito di corda e il numero di corda e galleggiare

a = ['hello','1','hi',2,'something','3'] 

voglio convertire i numeri nella lista in float, mantenendo le corde.

ho scritto questo:

for i in a: 
    try: 
     i = float(i) 
    except ValueError: 
     pass 

Esiste un modo più efficiente e pulito per fare questo?

+5

I numeri sono sempre nelle stesse posizioni? –

risposta

1

Si sta cambiando il valore della variabile i -> Il contenuto dell'array a non cambia! Se si desidera modificare i valori nella matrice, si dovrebbe piuttosto implementare in questo modo:

for index, value in enumerate(a): 
    try : 
     a[index] = float(value) 
    except ValueError : 
     pass 
4

Sulla base di quello che hai già provato:

a = ['hello', '1.0', 'hi', 2, 'blah blah', '3'] 

def float_or_string(item): 
    try: 
     return float(item) 
    except ValueError: 
     return item 


a = map(float_or_string, mylist) 

dovrebbe fare il trucco. Direi che un blocco try:... except:... è sia a) efficiente che b) ordinato. Come ha sottolineato halex, map() non modifica l'elenco in posizione, restituisce un nuovo elenco e si imposta a uguale ad esso.

1

Il try/tranne modo è il modo in cui Pythonic di farlo, ma se davvero odia, vedere se questo soddisfa le proprie esigenze:

a = ['hello','1','hi',2,'something','3'] 

pattern = re.compile(r'^(-?\d+)(\.\d+)?') 

b = [float(item) if isinstance(item, str) and re.match(pattern, item) 
else item for item in a] 
+1

Regex? Sembra un po 'come uccidere gli scarafaggi con un fucile :) –

+1

@JoelCornett Haha, pensavo che all'OP non piacesse il tentativo/eccetto il modo di farlo, quindi forse è meglio per lui. –

0

Cosa c'è di circa il mio piccolo esempio:

a = ['hello','1','hi',2,'something','3'] 

for i, item in enumerate(a): 
    if str(item).isdigit(): 
     a[i] = float(item) 

print a 
+1

Si spezzerebbe in '" 1.0 "'. Non sono sicuro se l'OP progetta di averne qualcuno, comunque. –

0

Penso che questo è breve e modo migliore:

a = ['hello','1','hi',2,'something','3'] 

for index,value in enumerate(a): 

    if isinstance(value,int): 

      a[index] = float(value) 

print a 

output è: [ 'ciao', '1', 'ciao', 2.0, 'qualcosa', '3']

Problemi correlati