How to convert list of intable strings to int

Question:

In Python, I want to convert a list of strings:

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

and convert the integers to integer types like this:

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

I tried:

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

but is showing an error.

How could I convert all intable strings in a list to int, leaving other elements as strings?

My list might be multi-dimensional. A method which works for a generic list would be preferable:

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

Asked By: sum2000

||

Answers:

I would create a generator to do it:

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)

If you want this to work on a list of lists, just:

new_list_of_lists = map(list, map(intify, list_of_lists))
Answered By: agf

I’d use a custom function:

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

Example:

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

Edit: If you need to apply the above to a list of lists, why didn’t you converted those strings to int while building the nested list?

Anyway, if you need to, it’s just a matter of choice on how to iterate over such nested list and apply the method above.

One way for doing that, might be:

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

You can obviusly reassign that to list_of_lists:

>>> list_of_lists = [[try_int(x) for x in lst] for lst in list_of_lists]
Answered By: Rik Poggi

How about using map and lambda

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

or with List comprehension

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

As mentioned in the comment, as isdigit may not capture negative numbers, here is a refined condition to handle it notable a string is a number if its alphanumeric and not a alphabet 🙂

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

Use isdigit() to check each character in the string to see if it is a digit.

Example:

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

For multidimenson lists, use recursive technique may help.

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) 
Answered By: Ray

Keep all values in the list

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

t = [int(v) if v.lstrip('-').isnumeric() else v for v in l]

print(t)

>>> ['sam', 1, 'dad', 21, -10]

Remove non-numeric values

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

t = [int(v) for v in t if v.lstrip('-').isnumeric()]

print(t)

>>> [1, 21, -10]

Nested list

l = [['aa', '2'], ['bb', '3'], ['sam', '1', 'dad', '21', '-10']]

t = [[int(v) if v.lstrip('-').isnumeric() else v for v in x] for x in l]

print(t)

>>> [['aa', 2], ['bb', 3], ['sam', 1, 'dad', 21, -10]]
Answered By: Trenton McKinney
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.