Mam krotkę z zapytania MySQL, takiego jak to:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Chciałbym przekonwertować wszystkie ciągi znaków na liczby całkowite i umieścić je z powrotem na liście list:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Próbowałem to osiągnąć, eval
ale nie uzyskałem jeszcze żadnego przyzwoitego rezultatu.
Odpowiedzi:
int()
jest standardową wbudowaną funkcją Pythona do konwersji ciągu na wartość całkowitą. Wywołujesz go ciągiem zawierającym liczbę jako argument, a on zwraca liczbę przekonwertowaną na liczbę całkowitą:Powyższe wydruki
2
.Jeśli znasz strukturę swojej listy, T1 (że zawiera ona tylko listy, tylko jeden poziom), możesz to zrobić w Python 2:
W Pythonie 3:
źródło
T2 = map(lambda lol: map(int, lol), T1)
? Albo mapa, albo lista, oba są głupie;)Możesz to zrobić ze zrozumieniem listy:
Wewnętrzna listowego (
[int(column) for column in row]
) budujelist
zint
s z sekwencjiint
-able obiektów, takich jak ciągi znaków po przecinku, wrow
. Zewnętrzne rozumienie listy ([... for row in T1])
) buduje listę wyników wewnętrznego rozumienia listy zastosowanego do każdego elementu wT1
.Fragment kodu nie powiedzie się, jeśli którykolwiek z wierszy zawiera obiekty, których nie można przekonwertować
int
. Będziesz potrzebować inteligentniejszej funkcji, jeśli chcesz przetwarzać wiersze zawierające ciągi nie dziesiętne.Jeśli znasz strukturę wierszy, możesz zastąpić rozumienie wewnętrznej listy wywołaniem funkcji wiersza. Na przykład.
źródło
Wolałbym używać tylko list ze zrozumieniem:
źródło
Zamiast
int( )
put, put,float( )
które pozwoli ci używać miejsc po przecinku wraz z liczbami całkowitymi.źródło
Zgadzam się z dotychczasowymi odpowiedziami wszystkich, ale problem polega na tym, że jeśli nie masz wszystkich liczb całkowitych, ulegną one awarii.
Jeśli chcesz wykluczyć liczby całkowite, to
Daje to tylko rzeczywiste cyfry. Powodem, dla którego nie używam bezpośredniego rozumienia listy, jest to, że rozumienie listy przecieka ich wewnętrzne zmienne.
źródło
isdigit
jest trudne, spróbuj-1
.int(<str>)
jest sposobem sprawdzenia przeztry
/except
.źródło
Spróbuj tego.
x jest łańcuchem, ponieważ zawiera cudzysłowy, ale ma w sobie liczbę.
Ponieważ x ma w sobie cyfrę 1, mogę go zamienić na liczbę całkowitą.
Aby sprawdzić, czy ciąg znaków jest liczbą, możesz to zrobić.
Powinien zostać wypisany na IDLE True, ponieważ x jest liczbą.
Powinien być drukowany na IDLE False, ponieważ y nie jest liczbą.
źródło
x.isnumeric()
.Korzystanie ze zrozumień listy:
źródło
W Pythonie 3.5.1 takie rzeczy działają:
i
Jerzy.
źródło
Zobacz tę funkcję
Następnie
Możesz także sprawdzić
źródło
eval
jest złe: powinieneś je zastąpićast.literal_eval
.Kolejne funkcjonalne rozwiązanie dla Python 2:
Python 3 będzie jednak nieco niechlujny:
możemy to naprawić za pomocą opakowania
źródło
Jeśli to tylko krotka krotek, coś takiego
rows=[map(int, row) for row in rows]
wystarczy. (Jest tam zrozumienie listy i wywołanie map (f, lst), które jest równe [f (a) dla in lst], tam.)Ewaluacja nie jest tym, co chcesz zrobić, na wypadek gdyby
__import__("os").unlink("importantsystemfile")
z jakiegoś powodu w bazie danych było coś takiego . Zawsze sprawdzaj poprawność danych wejściowych (jeśli nie ma nic innego, wyjątek int () pojawi się, jeśli masz złe dane wejściowe).źródło
Możesz zrobić coś takiego:
źródło
Chcę udostępnić dostępną opcję, o której jeszcze nie wspomniano tutaj:
Wygeneruje losową permutację tablicy x. Nie do końca to, o co prosiłeś, ale jest to potencjalne rozwiązanie podobnych pytań.
źródło