2009-05-04 13 views

Odpowiedz

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

Elegancki jednolinijkowy. Spójrz na moc rozumienia list. – mkClark

+0

myślał na podobnych liniach – Nope

+0

dobre rozwiązanie, ale co, jeśli lista zawiera wartości zmiennoprzecinkowe również "[" średnia mrugnięcia "," 306 "," ERA "," 1710.5 "]' –

5

Dane wyglądają tak, jakbyś wiedział, na których pozycjach powinny znajdować się liczby. W tym przypadku to chyba lepiej jawnie przekonwertować dane w tych pozycjach, a nie tylko konwersja coś, co wygląda jak numer:

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

Tak jest to najlepsze rozwiązanie dla przypadku statycznego, podczas gdy Alex jest najlepszy dla przypadku dynamicznego. – Unknown

5

Spróbuj tego:

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 ] 

jeśli lista zawiera pływak , string i int (jak wskazano przez @ d.putto w komentarzu)

+1

'suma ([c.isalpha() dla cw f])' jest dość nieoptymalnym sposobem sprawdzenia "czy jakakolwiek litera wf jest alfabetyczna" - spróbuj 'any (c.isalpha() dla cw f) 'dla lepszej czytelności i wydajności. Oczywiście oba będą się nie sprawdzać, jeśli "f" będzie równe na przykład ''!' '- ciągowi, który nie jest liczbą, ale nie ma znaków alfanumerycznych - a także nie będzie konwertować np." 1.7e3 "- ciąg znaków, który zawiera znak alfanumeryczny, ale mimo wszystko byłby doskonale w porządku jako argument do 'float' (" notacja wykładnicza "). –

+0

prawda. dobry punkt ... zamieściłem to tylko po to, by odpowiedzieć na konkretny przykład d.putto. Powinienem przemyśleć jeszcze raz, zanim opublikuję moją połowiczną odpowiedź! –

Powiązane problemy