У меня есть кортеж кортежей из запроса 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
, но пока не получил никакого достойного результата.
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]
Это можно сделать с помощью понимания списка:
T2 = [[int(column) for column in row] for row in T1]
Внутренний список ([int(column) for column in row]
) строит список
intиз последовательности
int-возможных объектов, таких как десятичные строки, в
row. Внешний список (
[... for row in T1])) строит список из результатов внутреннего списка, примененного к каждому элементу в
T1`.
Фрагмент кода завершится неудачей, если какая-либо из строк содержит объекты, которые не могут быть преобразованы с помощью int
. Вам понадобится более умная функция, если вы хотите обрабатывать строки, содержащие недесятичные строки.
Если вы знаете структуру строк, вы можете заменить внутренний список вызовом функции строки. Например.
T2 = [parse_a_row_of_T1(row) for row in T1]
Я бы предпочел использовать только списки понимания:
[[int(y) for y in x] for x in T1]
Я бы согласился с всякие ответы, но проблема заключается в том, что если у вас нет всех чисел они будут врезаться.
Если вы хотели исключить номера-целые числа, то
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())
Это дает только фактические цифры. Почему я не'т использовать прямые списочные включения происходит потому, что понимание списке утечки своих внутренних переменных.
Попробуйте это.
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)
Она должна вывести на холостой ход верно, потому что X-это число.
y_test = is_number(y)
print(y_test)
Она должна вывести в режим ожидания false, потому что г не является числом.
В Python 3.5.1 вот такие работы:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
и
Enter number: 4.7
4
5
Джордж.
Еще одно функциональное решение для 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)
Увидеть эту функцию
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:'
Если это's только кортеж кортежей, что-то вроде строки=[карты(инт строки) в строке в строки]
будет делать трюк. (Там'с осознание списке и звонка карте(Ф ЛСТ), которая равна [ф(а) для себя в ЛСТ], есть.)
Eval-это не то, что вы хотите сделать, в случае, если там's что-то вроде __импорт__(на"ОС" - а).отвязать("и importantsystemfile", У)
в базе данных по какому-то поводу.
Всегда проверяйте ваш вклад (если ни с чем другим, за исключением инт() будет поднимать, если у вас плохой вход).
Я хочу поделиться доступный вариант, который не'т, кажется, чтобы быть упомянутым здесь, но:
rumpy.random.permutation(x)
Будет генерировать случайную перестановку массива x. Не точно, что вы просили, но это потенциальное решение подобных вопросов.
Вы можете сделать что-то вроде этого:
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)