2009-05-04 15 views

Antwort

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

Ein eleganter Einzeiler. Seht die Macht der List Comprehensions. – mkClark

+0

dachte auf ähnlichen Linien – Nope

+0

gute Lösung, aber was ist, wenn Liste Float-Werte auch '['Batting Durchschnitt', '306', 'ERA', '1710.5']' –

5

Die Daten sehen aus, als ob Sie wissen würden, in welchen Positionen die Zahlen sein sollen. In diesem Fall ist es wahrscheinlich besser, die Daten explizit in diesen Positionen zu konvertieren, anstatt nur etwas Umwandlung, die wie eine Zahl aussieht:

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

Yep Dies ist die beste Lösung für den statischen Fall, während Alex für den dynamischen Fall am besten geeignet ist. – Unknown

5

Versuchen Sie folgendes:

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 ] 

, wenn Ihre Liste enthält Schwimmer , string und int (wie von @ d.putto im Kommentar angedeutet)

+1

'sum ([c.isalpha() für c in f])' ist eine ziemlich suboptimale Methode, um zu überprüfen, "ob ein Zeichen in f alphabetisch ist" - probiere 'any (c.isalpha() für c in f) 'für bessere Lesbarkeit und Leistung. Natürlich werden beide fehlschlagen, wenn "f" zum Beispiel "!" Ist - eine Zeichenkette, die keine Zahl ist, aber keine alphanumerischen Zeichen hat - und auch nicht umwandeln kann, zB "1.7e3" - eine Zeichenkette, die enthält ein alphanumerisches Zeichen, wäre aber dennoch vollkommen in Ordnung, um als Argument an float zu übergeben ("Exponentialnotation"). –

+0

wahr. good point ... poste es, um dputtos spezifisches erfundenes Beispiel zu beantworten. Ich hätte mir mehr Gedanken machen müssen, bevor ich meine halbgebackene Antwort posten würde! –

Verwandte Themen