Jak przekonwertować ciągi znaków na liczby całkowite w Pythonie?

Mam krotkę krotek z zapytania MySQL w następujący sposób:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

I'would like to convert all the string elements into integers and put them back into a list of lists:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

Próbowałem to osiągnąć za pomocą eval, ale nie uzyskałem jeszcze żadnego przyzwoitego wyniku.

Rozwiązanie

int() jest standardową wbudowaną funkcją Pythona służącą do konwersji łańcucha znaków na wartość całkowitą. Wywołujesz ją z łańcuchem zawierającym liczbę jako argument, a ona zwraca liczbę przekonwertowaną na liczbę całkowitą:

print (int("1") + 1)

Powyższy wynik to 2.

Jeśli znasz strukturę swojej listy, T1 (że po prostu zawiera listy, tylko jeden poziom), możesz to zrobić w Pythonie 2:

T2 = [map(int, x) for x in T1]

W Pythonie 3:

T2 = [list(map(int, x)) for x in T1]
Komentarze (2)

Możesz to zrobić za pomocą zrozumienia listy:

T2 = [[int(column) for column in row] for row in T1]

The inner list comprehension ([int(column) for column in row]) builds a list of ints from a sequence of int-able objects, like decimal strings, in row. The outer list comprehension ([... for row in T1])) buduje listę wyników wewnętrznego list comprehension zastosowanych do każdego elementu w T1.

Ten fragment kodu nie powiedzie się, jeśli któryś z wierszy będzie zawierał obiekty, które nie mogą być konwertowane przez int. Jeśli chcesz przetwarzać wiersze zawierające łańcuchy niedziesiętne, będziesz potrzebował bardziej inteligentnej funkcji.

Jeśli znasz strukturę wierszy, możesz zastąpić wewnętrzne zrozumienie listy wywołaniem funkcji dla danego wiersza. Na przykład.

T2 = [parse_a_row_of_T1(row) for row in T1]
Komentarze (0)

Jeśli to'tylko tuple tupli, coś jak rows=[map(int, row) for row in rows] zrobi sztuczkę. (Tam jest lista comprehension i wywołanie map(f, lst), które jest równe [f(a) for a in lst]).

Eval jest nie tym, co chcesz zrobić, na wypadek, gdyby w twojej bazie danych z jakiegoś powodu było coś takiego jak __import__("os").unlink("importantsystemfile"). Zawsze sprawdzaj poprawność swoich danych wejściowych (jeśli nie ma nic innego, wyjątek int() podniesie się, jeśli masz złe dane wejściowe).

Komentarze (0)