Как преобразовать список нестабильных строк в int - PullRequest
6 голосов
/ 26 марта 2012

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

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

и преобразовать целые числа в целочисленные типы, например:

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

Я пытался:

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

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 26 марта 2012

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

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

Вы можете явно присвоить это list_of_lists:

>>> list_of_lists = [[try_int(x) for x in lst] for lst in list_of_lists]
3 голосов
/ 26 марта 2012

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

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))
1 голос
/ 26 марта 2012

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

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) 
1 голос
/ 26 марта 2012

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

>>> 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]
0 голосов
/ 26 марта 2012

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

Пример:

mylist = ['foo', '3', 'bar', '9']
t = [ int(item) if item.isdigit() else item for item in mylist ] 
print(t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...