将列表中的str编号转换为int并找出列表的总和

时间:2015-04-25 18:58:47

标签: python string list python-3.x sum

我有一个列表,但其中的数字是字符串,所以我无法找到列表的总和,所以我需要帮助将列表中的数字转换为int。

这是我的代码

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

所以基本上有名为cals的列表 它看起来像这个

 (20,45,...etc)

但是它中的数字是字符串所以当我尝试找到这样的总和时

TotalCal = sum(cals)

然后运行它会显示一个错误,说列表需要是一个int格式 所以问题是如何将list中的所有数字转换为int格式?

如果您有不同的方法来查找列表总和,那也很好。

2 个答案:

答案 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 mentionsimap方式是最好的方式!快速 1 看起来很棒!包含库函数使其仅在小列表上,而不在大型列表上。因此,对于大型列表,imap更适合。

1 列表理解仍比map慢1微秒!感谢上帝

答案 1 :(得分:2)

sum(map(float,cals))

sum(float(i) for i in cals)