it-swarm.com.ru

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

397
elfuego1

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]
580
unwind

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

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

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

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

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

T2 = [parse_a_row_of_T1(row) for row in T1]
28
Will Harris

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

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

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

13
weir99

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

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

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

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

11
Christian Witts
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
10
P.Hunter

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

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

6
TheRedstoneLemon

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

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

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

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

а также

Enter number:  4.7
4
5

Джордж.

4
George Moraitis

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

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:'
3
Shameem

Еще одно функциональное решение для 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)
3
Eli Korvigo

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

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

1
AKX

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

rumpy.random.permutation(x)

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

0
samvoit4