Yousef shihadeh
Yousef shihadeh

Reputation: 11

Converting str numbers in list to int and find out the sum of the list

I have a list, but the numbers in it are strings so I can't find the sum of the list, so I need help in converting the numbers in the list to int.

This is my code

def convertStr(cals):
    ret = float(cals)
return ret
TotalCal = sum(cals)

So basically there is list called cals and it looks like this

 (20,45,...etc)

But the numbers in it are strings so when I try finding the sum like this

TotalCal = sum(cals)

And then run it shows an error saying that the list needs to be an int format so the question is how do I convert all numbers in the list to int format?

If you have a different way of finding the sum of lists it will be good too.

Upvotes: 0

Views: 123

Answers (2)

Bhargav Rao
Bhargav Rao

Reputation: 52071

You can use either the python builtin map or a list comprehension for this

def convertStr(cals):
    ret = [float(i) for i in (cals)]
    return ret

or

def convertStr(cals):
    return map(float,cals)

Here are the timeit results for both the approaches

$ python -m timeit "cals = ['1','2','3','4'];[float(i) for i in (cals)]"
1000000 loops, best of 3: 0.804 usec per loop
$ python -m timeit "cals = ['1','2','3','4'];map(float,cals)"
1000000 loops, best of 3: 0.787 usec per loop

As you can see map is faster and more pythonic as compared to the list comprehension. This is discussed in full length here

map may be microscopically faster in some cases (when you're NOT making a lambda for the purpose, but using the same function in map and a listcomp). List comprehensions may be faster in other cases


Another way using itertools.imap. This is the fastest for long lists

from itertools import imap
TotalCal = sum(imap(float,cals)

And using timeit for a list with 1000 entries.

$ python -m timeit "import random;cals = [str(random.randint(0,100)) for r in range(1000)];sum(map(float,cals))"
1000 loops, best of 3: 1.38 msec per loop
$ python -m timeit "import random;cals = [str(random.randint(0,100)) for r in range(1000)];[float(i) for i in (cals)]"
1000 loops, best of 3: 1.39 msec per loop
$ python -m timeit "from itertools import imap;import random;cals = [str(random.randint(0,100)) for r in range(1000)];imap(float,cals)"
1000 loops, best of 3: 1.24 msec per loop

As Padraic mentions below, The imap way is the best way to go! It is fast1 and looks great! Inclusion of a library function has it's bearing on small lists only and not on large lists. Thus for large lists, imap is better suited.

1 List comprehension is still slower than map by 1 micro second!!! Thank god

Upvotes: 4

tommy.carstensen
tommy.carstensen

Reputation: 9622

sum(map(float,cals))

or

sum(float(i) for i in cals)

Upvotes: 2

Related Questions