Как преобразовать строки в целые числа в 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, но пока не получил никакого достойного результата.

Комментарии к вопросу (4)
Решение

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]) строит списокintиз последовательностиint-возможных объектов, таких как десятичные строки, вrow. Внешний список ([... for row in T1])) строит список из результатов внутреннего списка, примененного к каждому элементу вT1`.

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

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

T2 = [parse_a_row_of_T1(row) for row in T1]
Комментарии (0)

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

[[int(y) for y in x] for x in T1]
Комментарии (0)

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

Комментарии (1)

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

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

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

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

Комментарии (1)
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
Комментарии (1)

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

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)

Она должна вывести на холостой ход верно, потому что X-это число.

y_test = is_number(y)

print(y_test)

Она должна вывести в режим ожидания false, потому что г не является числом.

Комментарии (2)

В Python 3.5.1 вот такие работы:

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

и

Enter number:  4.7
4
5

Джордж.

Комментарии (0)

Используя списочные включения:

t2 = [map(int, list(l)) for l in t1]
Комментарии (1)

Еще одно функциональное решение для 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)
Комментарии (0)

Увидеть эту функцию

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:'
Комментарии (1)

Если это's только кортеж кортежей, что-то вроде строки=[карты(инт строки) в строке в строки] будет делать трюк. (Там'с осознание списке и звонка карте(Ф ЛСТ), которая равна [ф(а) для себя в ЛСТ], есть.)

Eval-это не то, что вы хотите сделать, в случае, если там's что-то вроде __импорт__(на"ОС" - а).отвязать("и importantsystemfile", У) в базе данных по какому-то поводу. Всегда проверяйте ваш вклад (если ни с чем другим, за исключением инт() будет поднимать, если у вас плохой вход).

Комментарии (0)

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

rumpy.random.permutation(x)

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

Комментарии (0)

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

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)  
Комментарии (0)