Как преобразовать строки в целые числа в Python?

У меня есть кортеж кортежей из MySQL-запроса, например:

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

Я хотел бы преобразовать все строковые элементы в целые числа и поместить их обратно в список списков:

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

Я пытался добиться этого с помощью eval, но пока не получил никакого достойного результата.

Ответ 1

int() - встроенная функция стандарта Python для преобразования строки в целочисленное значение. Вы вызываете его с строкой, содержащей число в качестве аргумента, и возвращает число, преобразованное в целое число:

print (int("1") + 1)

Вышеприведенные отпечатки 2.

Если вы знаете структуру своего списка, T1 (он просто содержит списки, только один уровень), вы можете сделать это в Python 2:

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

В Python 3:

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

Ответ 2

Вы можете сделать это со списком:

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

Внутреннее понимание списка ([int(column) for column in row]) создает list из int из последовательности объектов int -able, таких как десятичные строки, в row. Понятие внешнего списка ([... for row in T1])) создает список результатов внутреннего понимания списка, применяемого к каждому элементу в T1.

Фрагмент кода завершится неудачно, если какая-либо из строк содержит объекты, которые невозможно преобразовать с помощью int. Вам понадобится более разумная функция, если вы хотите обрабатывать строки, содержащие не десятичные строки.

Если вы знаете структуру строк, вы можете заменить внутреннее понимание списка вызовом функции строки. Например.

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

Ответ 3

Я предпочел бы использовать только списки понимания:

[[int(y) for y in x] for x in T1]

Ответ 4

Вместо того, чтобы положить int( ), поместите float( ), который позволит вам использовать десятичные числа вместе с целыми числами.

Ответ 5

Я бы согласился с любыми ответами до сих пор, но проблема в том, что если у вас нет всех целых чисел, они будут разбиваться.

Если вы хотите исключить нецелые числа, то

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())

Это дает только действительные цифры. Причина, по которой я не использую прямые проверки списков, заключается в том, что понимание списков утечки внутренних переменных.

Ответ 6

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

Ответ 7

Попробуйте это.

x = "1"

x - это строка, потому что она содержит кавычки вокруг нее, но в ней есть число.

x = int(x)

Так как x имеет число 1 в нем, я могу превратить его в целое число.

Чтобы узнать, является ли строка числом, вы можете сделать это.

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)

Он должен печатать на IDLE True, потому что x является числом.

y_test = is_number(y)

print(y_test)

Он должен печатать на IDLE False, потому что y не является числом.

Ответ 8

Использование списков:

t2 = [map(int, list(l)) for l in t1]

Ответ 9

В Python 3.5.1 такие вещи, как эти:

c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

и

Enter number:  4.7
4
5

Джордж.

Ответ 10

Еще одно функциональное решение для Python 2:

from functools import partial

map(partial(map, int), T1)

Python 3 будет немного запутанным, хотя:

list(map(list, map(partial(map, int), T1)))

мы можем исправить это с помощью обертки

def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)

Ответ 11

См. эту функцию

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

Тогда

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

Вы также можете проверить

if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'

Ответ 12

Если это только кортеж кортежей, что-то вроде rows=[map(int, row) for row in rows] сделает трюк. (Там есть понимание списка и вызов map (f, lst), который в этом случае равен [f (a) для a в lst].)

Eval - это не то, что вы хотите сделать, если в вашей базе есть что-то вроде __import__("os").unlink("importantsystemfile"). Всегда проверяйте свой ввод (если ничего больше, исключение int() будет повышаться, если у вас плохой ввод).

Ответ 13

Я хочу поделиться доступной опцией, которая, кажется, еще не упомянута здесь:

rumpy.random.permutation(x)

Будет генерировать случайную перестановку массива х. Не совсем то, что вы просили, но это потенциальное решение для подобных вопросов.

Ответ 14

Вы можете сделать что-то вроде этого:

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)  

Ответ 15

for str in T2 :
    return num(str)

возможно, что ll work