0

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.

Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
  • Does `cals` only hold integers? – tommy.carstensen Apr 25 '15 at 19:14
  • Please [accept](http://meta.stackexchange.com/questions/5234) an answer if you think it solves your problem. It will community at large to recognize the correct solution. This can be done by clicking the green check mark next to the answer. See this [image](http://i.stack.imgur.com/uqJeW.png) for reference. Cheers. – Bhargav Rao Dec 09 '15 at 07:42

2 Answers2

4

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

Community
  • 1
  • 1
Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
2
sum(map(float,cals))

or

sum(float(i) for i in cals)
tommy.carstensen
  • 8,962
  • 15
  • 65
  • 108