Как преобразовать строки в целые числа в 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
, но пока не получил никакого достойного результата.
Ответы
Ответ 1
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]
) создает list
из int
из последовательности объектов int
-able, таких как десятичные строки, в row
. Понятие внешнего списка ([... for row in T1])
) создает список результатов внутреннего понимания списка, применяемого к каждому элементу в T1
.
Фрагмент кода завершится неудачно, если какая-либо из строк содержит объекты, которые невозможно преобразовать с помощью int
. Вам понадобится более разумная функция, если вы хотите обрабатывать строки, содержащие не десятичные строки.
Если вы знаете структуру строк, вы можете заменить внутреннее понимание списка вызовом функции строки. Например.
T2 = [parse_a_row_of_T1(row) for row in T1]
Ответ 3
Я предпочел бы использовать только списки понимания:
[[int(y) for y in x] for x in T1]
Ответ 4
Вместо того, чтобы положить int( )
, поместите float( )
, который позволит вам использовать десятичные числа вместе с целыми числами.
Ответ 5
Я бы согласился с любыми ответами до сих пор, но проблема в том, что если у вас нет всех целых чисел, они будут разбиваться.
Если вы хотите исключить нецелые числа, то
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())
Это дает только действительные цифры. Причина, по которой я не использую прямые проверки списков, заключается в том, что понимание списков утечки внутренних переменных.
Ответ 6
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
Попробуйте это.
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, потому что y не является числом.
Ответ 8
Использование списков:
t2 = [map(int, list(l)) for l in t1]
Ответ 9
В Python 3.5.1 такие вещи, как эти:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
и
Enter number: 4.7
4
5
Джордж.
Ответ 10
Еще одно функциональное решение для 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)
Ответ 11
См. эту функцию
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:'
Ответ 12
Если это только кортеж кортежей, что-то вроде rows=[map(int, row) for row in rows]
сделает трюк. (Там есть понимание списка и вызов map (f, lst), который в этом случае равен [f (a) для a в lst].)
Eval - это не то, что вы хотите сделать, если в вашей базе есть что-то вроде __import__("os").unlink("importantsystemfile")
.
Всегда проверяйте свой ввод (если ничего больше, исключение int() будет повышаться, если у вас плохой ввод).
Ответ 13
Я хочу поделиться доступной опцией, которая, кажется, еще не упомянута здесь:
rumpy.random.permutation(x)
Будет генерировать случайную перестановку массива х. Не совсем то, что вы просили, но это потенциальное решение для подобных вопросов.
Ответ 14
Вы можете сделать что-то вроде этого:
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)
Ответ 15
for str in T2 :
return num(str)
возможно, что ll work