2013-03-02 10 views
9

I często znajduję się w liście, który wygląda tak:Konwersja podzbiór ciągów liczb na liście

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

Co jest najbardziej pythonic sposobem konwersji określone ciągi w tym liście do int?

I zazwyczaj coś takiego:

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

Powyższe podejście wydaje się błędne. Czy istnieje lepszy sposób konwersji tylko niektórych elementów na liście na liczby całkowite?

Odpowiedz

10

powiedziałbym coś takiego:

>>> 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

To może być również zastosowane do pływaków? Nie mogłem znaleźć odpowiedniej metody 'isfloat()'. – turtle

+0

W bardziej ogólnym celu można napisać wyrażenie regularne pasujące lub podobne @JFSebastian i opakować konwersję w bloku try/except w funkcji narzędzia. – FatalError

5

int i .isdigit może nie zgadzać się w przypadku Unicode tj int może nie do analizowania ciąg nawet jeśli .isdigit powraca True na sznurku.

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

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

@FatalError odpowiedź jest chyba to, czego szukasz, ale jeśli chcesz po prostu przekonwertować niektóre elementy (nie wszystkie numery) do liczby całkowitej mógłby zrobić coś takiego:

>>> 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'] 
Powiązane problemy