2013-03-02 24 views
9

Mi capita spesso mi ritrovo con una lista che assomiglia a questo:Conversione sottoinsieme di stringhe di numeri interi in un elenco

lst = ['A', '1', '2', 'B', '1', 'C', 'D', '4', '1', '4', '5', 'Z', 'D'] 

Qual è il modo più divinatorio per convertire le stringhe specifiche in questo elenco di int?

Io di solito fare qualcosa di simile:

lst = [lst[0], int(lst[1]), int(lst[2]), lst[3], ...] 

L'approccio di cui sopra sembra sbagliato. C'è un modo migliore per convertire solo determinati elementi negli elenchi in numeri interi?

risposta

10

vorrei dire qualcosa del tipo:

>>> lst = ['A', '1', '2', 'B', '1', 'C', 'D', '4', '1', '4', '5', 'Z', 'D'] 
>>> lst = [int(s) if s.isdigit() else s for s in lst] 
>>> lst 
['A', 1, 2, 'B', 1, 'C', 'D', 4, 1, 4, 5, 'Z', 'D'] 
+0

Può questo essere applicato anche ai galleggianti? Non sono riuscito a trovare un metodo 'isfloat()' corrispondente. – turtle

+0

Per motivi più generali è possibile scrivere una regex per fare corrispondenze o fare come @JFSebastian e avvolgere la conversione in un blocco try/except in una funzione di utilità. – FatalError

5

int e .isdigit può non essere d'accordo in Unicode caso cioè int potrebbe non riuscire a analizzare una stringa anche se .isdigit rendimenti True per la stringa.

def maybe_int(s): 
    try: 
     return int(s) 
    except ValueError: 
     return s 

lst = [maybe_int(s) for s in lst] 
0

@FatalError risposta è probabilmente quello che stai cercando, ma se si desidera convertire solo alcune voci (non tutti i numeri) a intero si potrebbe fare qualcosa di simile:

>>> lst = ['A', '1', '2', 'B', '1', 'C', 'D', '4', '1', '4', '5', 'Z', 'D'] 
>>> indices = [1,2] 
>>> [int(lst[x]) if x in indices else lst[x] for x in xrange(len(lst))] 
['A', 1, 2, 'B', '1', 'C', 'D', '4', '1', '4', '5', 'Z', 'D'] 
Problemi correlati