Как преобразовать список intable строк в int

В Python я хочу преобразовать список строк:

l = ['sam','1','dad','21']

и преобразуйте целые числа в целые типы следующим образом:

t = ['sam',1,'dad',21]

Я пробовал:

t = [map(int, x) for x in l]

но показывает ошибку.

Как мне преобразовать все intable строки в список в int, оставив другие элементы в виде строк?

Мой список может быть многомерным. Предпочтительным будет метод, который работает для общего списка:

l=[['aa','2'],['bb','3']]

5 ответов

Я бы использовал пользовательскую функцию:

def try_int(x):
 try:
 return int(x)
 except ValueError:
 return x

Пример:

>>> [try_int(x) for x in ['sam', '1', 'dad', '21']]
['sam', 1, 'dad', 21]

Изменить: Если вам нужно применить вышеуказанное к списку списков, почему вы не преобразовали эти строки в int при построении вложенного списка?

В любом случае, если вам нужно, это просто вопрос о том, как перебирать такой вложенный список и применять метод выше.

Один из способов сделать это может быть:

>>> list_of_lists = [['aa', '2'], ['bb', '3']]
>>> [[try_int(x) for x in lst] for lst in list_of_lists]
[['aa', 2], ['bb', 3]]

Вы можете obviusly переназначить это на list_of_lists:

>>> list_of_lists = [[try_int(x) for x in lst] for lst in list_of_lists]


Я бы создал генератор для этого:

def intify(lst):
 for i in lst:
 try:
 i = int(i)
 except ValueError:
 pass
 yield i
lst = ['sam','1','dad','21']
intified_list = list(intify(lst))
# or if you want to modify an existing list
# lst[:] = intify(lst)

Если вы хотите, чтобы это работало в списке списков, просто:

new_list_of_lists = map(list, map(intify, list_of_lists))


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

>>> map(lambda x:int(x) if x.isdigit() else x,['sam','1','dad','21'])
['sam', 1, 'dad', 21]

или с пониманием списка

>>> [int(x) if x.isdigit() else x for x in ['sam','1','dad','21']]
['sam', 1, 'dad', 21]
>>>

Как уже упоминалось в комментарии, поскольку isdigit не может записывать отрицательные числа, вот уточненное условие, чтобы обрабатывать его, примечание: строка представляет собой число, если его буквенно-цифровое, а не алфавит: -)

>>> [int(x) if x.isalnum() and not x.isalpha() else x for x in ['sam','1','dad','21']]
['sam', 1, 'dad', 21]


Для многодименсионных списков использование рекурсивной техники может помочь.

from collections import Iterable
def intify(maybeLst):
 try:
 return int(maybeLst)
 except:
 if isinstance(maybeLst, Iterable) and not isinstance(lst, str):
 return [intify(i) for i in maybeLst] # here we call intify itself!
 else:
 return maybeLst
maybeLst = [[['sam', 2],'1'],['dad','21']]
print intify(maybeLst)


Используйте isdigit(), чтобы проверить каждый символ в строке, чтобы увидеть, является ли это цифрой.

Пример:

mylist = ['foo', '3', 'bar', '9']
t = [ int(item) if item.isdigit() else item for item in mylist ] 
print(t)

licensed under cc by-sa 3.0 with attribution.