sum2000
sum2000

Reputation: 1393

How to convert list of intable strings to int

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

Upvotes: 6

Views: 13049

Answers (6)

Trenton McKinney
Trenton McKinney

Reputation: 62393

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

Upvotes: 0

Mariusz Jamro
Mariusz Jamro

Reputation: 31633

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)

Upvotes: 0

Rik Poggi
Rik Poggi

Reputation: 29302

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]

Upvotes: 12

Ray
Ray

Reputation: 1667

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) 

Upvotes: 1

agf
agf

Reputation: 176750

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

Upvotes: 3

Abhijit
Abhijit

Reputation: 63707

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]

Upvotes: 3

Related Questions