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.

Author: codeforester, 2009-03-13

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]
 544
Author: unwind,
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]
 27
Author: Will Harris,
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]
 15
Author: odwl,
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.

 12
Author: weir99,
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.

 10
Author: Christian Witts,
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
 9
Author: P.Hunter,
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ą.

 5
Author: TheRedstoneLemon,
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]
 3
Author: Jon,
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.
 3
Author: George Moraitis,
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)
 2
Author: Eli Korvigo,
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:'
 1
Author: Shameem,
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).

 0
Author: AKX,
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)  
 -1
Author: Amit Rawat,
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