Як перетворити рядки в цілі числа в 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 = list (список (int (a) для a в b) для b в T1, якщо a.isdigit ())
Гість

Подібне запитання для вкладеного списку: Перетворити всі рядки у списку в int
Aran-Fey

Відповіді:


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]

Внутрішнє розуміння списку ( [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.
totoro

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)

Оскільки у 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 - не число.


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] зробить трюк. (Там є розуміння списку та виклик до карти (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)

Згенерує випадкову перестановку масиву x. Не зовсім те, про що ви просили, але це потенційне рішення подібних питань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.