Как преобразовать строки в целые числа в Python? - PullRequest
410 голосов
/ 13 марта 2009

У меня есть кортеж из запроса 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, но пока не получил приличного результата.

Ответы [ 14 ]

589 голосов
/ 13 марта 2009

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]
28 голосов
/ 13 марта 2009

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

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

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

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

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

T2 = [parse_a_row_of_T1(row) for row in T1]
16 голосов
/ 13 мая 2009

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

[[int(y) for y in x] for x in T1]
13 голосов
/ 25 января 2014

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

11 голосов
/ 13 марта 2009

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

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

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

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

9 голосов
/ 25 марта 2011
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
6 голосов
/ 30 мая 2015

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

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, потому что у не число.

4 голосов
/ 27 мая 2016

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

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

и

Enter number:  4.7
4
5

Джордж.

4 голосов
/ 13 марта 2009

Использование списочных представлений:

t2 = [map(int, list(l)) for l in t1]
3 голосов
/ 13 июля 2017

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

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:'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...