我有一个列表,但其中的数字是字符串,所以我无法找到列表的总和,所以我需要帮助将列表中的数字转换为int。
这是我的代码
def convertStr(cals):
ret = float(cals)
return ret
TotalCal = sum(cals)
所以基本上有名为cals
的列表
它看起来像这个
(20,45,...etc)
但是它中的数字是字符串所以当我尝试找到这样的总和时
TotalCal = sum(cals)
然后运行它会显示一个错误,说列表需要是一个int格式
所以问题是如何将list
中的所有数字转换为int格式?
如果您有不同的方法来查找列表总和,那也很好。
答案 0 :(得分:4)
您可以使用python builtin map
或列表理解
def convertStr(cals):
ret = [float(i) for i in (cals)]
return ret
或
def convertStr(cals):
return map(float,cals)
以下是这两种方法的timeit
结果
$ 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
正如您所看到的,与列表理解相比,map
更快,更pythonic。这将在全文here
在某些情况下,地图可能在显微镜下更快(当你没有为此目的制作lambda,但在map和listcomp中使用相同的函数时)。在其他情况下,列表推导可能会更快
使用itertools.imap
的另一种方式。这是长列表的最快
from itertools import imap
TotalCal = sum(imap(float,cals)
使用timeit
获取包含1000个条目的列表。
$ 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
如下面的Padraic mentions,imap
方式是最好的方式!快速 1 看起来很棒!包含库函数使其仅在小列表上,而不在大型列表上。因此,对于大型列表,imap
更适合。
1 列表理解仍比map
慢1微秒!感谢上帝
答案 1 :(得分:2)
sum(map(float,cals))
或
sum(float(i) for i in cals)