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


2
Возможно рассмотрите другой модуль адаптера базы данных? Я знаю, что адаптерные модули PostgreSQL будут возвращать результаты, подобные вашему T2.
Kquinn


пожалуйста, обратите внимание: при использовании карты вы получите список объектов карты в 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]

12

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


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

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


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

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

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 () будет вызывать, если у вас неверный ввод).


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.