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

438

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

elfuego1
источник
2
Возможно рассмотрите другой модуль адаптера базы данных? Я знаю, что адаптерные модули PostgreSQL будут возвращать результаты, подобные вашему T2.
Kquinn
3
Возможная копия Parse String для Float или Int
Натан
пожалуйста, обратите внимание: при использовании карты вы получите список объектов карты в Python 3 и 3.5. Это делается для Python 3.5, как указано выше. new_list = список (список (int (a) для a в b) для b в T1, если a.isdigit ())
Гость
Аналогичный вопрос для не вложенного списка: конвертировать все строки в списке в int
Аран-Фей,

Ответы:

630

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]
размотать
источник
4
почему нет T2 = map(lambda lol: map(int, lol), T1)? Либо карта, либо список понимания, оба глупы;)
летающие овцы
4
@flyingsheep Двойная карта кажется мне глупой, кажется, это нормально.
jamylak
Как насчет удаления примера Python 2 (из-за окончания срока службы Python2)?
Алиссо
28

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

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

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

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

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

T2 = [parse_a_row_of_T1(row) for row in T1]
Уилл Харрис
источник
16

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

[[int(y) for y in x] for x in T1]
odwl
источник
12

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

weir99
источник
2
Можете ли вы объяснить более подробно на ваш ответ?
Рико
10

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

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

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

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

Кристиан Виттс
источник
2
isdigitсложно, примерь это -1. int(<str>)это способ проверить с помощью try/ except.
Тоторо
9
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
P.Hunter
источник
7
Добро пожаловать в переполнение стека! Вместо того, чтобы только публиковать блок кода, пожалуйста, объясните, почему этот код решает поставленную проблему. Без объяснения это не ответ.
Артемикс
7

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

x = "1"

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

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

TheRedstoneLemon
источник
2
Ваша функция is_number неверна. «1» не равно 1. Это не Perl. :-P
Veky
3
Не изобретай велосипед, используй x.isnumeric().
bfontaine
4

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

t2 = [map(int, list(l)) for l in t1]
Джон
источник
1
в Python 3 это возвращает список объектов карты :(
CpILL
3

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

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

а также

Enter number:  4.7
4
5

Джордж.

Джордж Мораитис
источник
3

Смотрите эту функцию

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:'
Шамим
источник
evalэто зло: вы должны заменить его на ast.literal_eval.
Эли Корвиго
3

Еще одно функциональное решение для 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)
Эли Корвиго
источник
1

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

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

AKX
источник
-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 if a.isdigit()) for b in T1)  
print(new_list)  
Амит Рават
источник
-1

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

rumpy.random.permutation(x)

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

samvoit4
источник