Jak konwertować ciągi znaków na liczby całkowite w Pythonie?
Mam krotkę krotek z zapytania MySQL takiego:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Chciałbym przekonwertować wszystkie elementy ciągu 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]]
Starałem się to osiągnąć eval
, ale nie uzyskałem jeszcze żadnego przyzwoitego wyniku.
13 answers
int()
jest standardową wbudowaną funkcją Pythona do konwersji ciągu znaków na wartość całkowitą. Wywołujesz go łańcuchem zawierającym liczbę jako argument, a on zwraca liczbę przekonwertowaną na liczbę całkowitą:
print (int("1") + 1)
Powyższe wydruki 2
.
Jeśli znasz strukturę swojej listy, T1 (że zawiera ona po prostu 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]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 17:59:31
Możesz to zrobić ze zrozumieniem listy:
T2 = [[int(column) for column in row] for row in T1]
Wewnętrzne zrozumienie listy ([int(column) for column in row]
) buduje list
z int
S z sekwencji int
-able obiektów, takich jak ciągi dziesiętne, w row
. Outer list comprehension ([... for row in T1])
) tworzy listę wyników wewnętrznego rozumienia listy zastosowanego do każdego elementu w T1
.
Urywek kodu nie powiedzie się, jeśli któryś z wierszy zawiera obiekty, których nie można przekonwertować przez int
. Potrzebujesz inteligentniejszej funkcji, jeśli chcesz przetwarzać wiersze zawierające ciągi nie dziesiętne.
Jeśli znasz strukturę wierszy, możesz zastąpić wewnętrzne zrozumienie listy wywołaniem funkcji wiersza. Np.
T2 = [parse_a_row_of_T1(row) for row in T1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 11:28:02
Wolałbym używać tylko list ze zrozumieniem:
[[int(y) for y in x] for x in T1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-12 23:33:41
Zamiast int( )
, umieść float( )
, co pozwoli Ci używać dziesiętnych wraz z liczbami całkowitymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 18:24:20
Zgadzam się z wszystkimi odpowiedziami na razie, ale problem w tym, że jeśli nie masz wszystkich liczb całkowitych, to się rozwalą.
Jeśli chcesz wykluczyć Nie-liczby całkowite to
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())
To daje tylko rzeczywiste cyfry. Powodem, dla którego nie używam direct list comprehensions, jest to, że rozumienie list wycieka z ich wewnętrznych zmiennych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 14:05:10
T3=[]
for i in range(0,len(T1)):
T3.append([])
for j in range(0,len(T1[i])):
b=int(T1[i][j])
T3[i].append(b)
print T3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 12:15:55
Spróbuj tego.
x = "1"
X jest ciągiem znaków, ponieważ ma wokół siebie cudzysłowy, ale ma w sobie liczbę.
x = int(x)
Ponieważ x ma w sobie liczbę 1, mogę zamienić ją na liczbę całkowitą.
Aby sprawdzić, czy ciąg znaków jest liczbą, możesz to zrobić.
def is_number(var):
try:
if var == int(var):
return True
except Exception:
return False
x = "1"
y = "test"
x_test = is_number(x)
print(x_test)
Powinno być wypisane na IDLE True, ponieważ x jest liczbą.
y_test = is_number(y)
print(y_test)
Powinno być wypisane jako IDLE False, ponieważ y nie jest liczbą.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-30 17:38:14
Używanie składni list:
t2 = [map(int, list(l)) for l in t1]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 11:06:14
W Pythonie 3.5.1 takie rzeczy działają:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
I
Enter number: 4.7
4
5
George.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 17:17:22
Yet another functional solution for Python 2:
from functools import partial
map(partial(map, int), T1)
Python 3 będzie trochę niechlujny:
list(map(list, map(partial(map, int), T1)))
Możemy to naprawić za pomocą owijarki
def oldmap(f, iterable):
return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 18:50:06
Zobacz tę funkcję
def parse_int(s):
try:
res = int(eval(str(s)))
if type(res) == int:
return res
except:
return
Then
val = parse_int('10') # Return 10
val = parse_int('0') # Return 0
val = parse_int('10.5') # Return 10
val = parse_int('0.0') # Return 0
val = parse_int('Ten') # Return None
Możesz również sprawdzić
if val == None: # True if input value can not be converted
pass # Note: Don't use 'if not val:'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 06:22:58
Jeśli to tylko krotka krotek, coś w rodzaju rows=[map(int, row) for row in rows]
załatwi sprawę. (Tam jest lista i wywołanie map(f, lst), które jest równe [f (a) Dla a w lst].)
Eval jest a nie tym, co chcesz zrobić, na wypadek, gdyby z jakiegoś powodu w Twojej bazie danych było coś takiego jak __import__("os").unlink("importantsystemfile")
.
Zawsze sprawdzaj poprawność danych wejściowych (jeśli nie ma nic innego, wyjątek int() podniesie, jeśli masz złe dane wejściowe).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 11:36:38
Możesz zrobić coś takiego:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)
print(new_list)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 13:37:12