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.
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]
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 int
s 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]
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).