在每个列表元素上调用int()函数?


183

我有一个包含数字字符串的列表,如下所示:

numbers = ['1', '5', '10', '8'];

我想将每个列表元素都转换为整数,所以它看起来像这样:

numbers = [1, 5, 10, 8];

我可以使用循环来做到这一点,就像这样:

new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

一定很丑吗?我敢肯定,在一行代码中,还有一种更Python化的方法可以做到这一点。请帮帮我。


1
您正在使用哪个版本的Python?
Mark Byers 2010年

Answers:



131

在Python 2.x中,另一种方法是使用map

numbers = map(int, numbers)

注意:在Python 3.x中,map返回一个地图对象,如果需要,可以将其转换为列表:

numbers = list(map(int, numbers))

11
在Python 3.x中,map返回迭代器而不是列表,因此需要像需要列表那样编写它list(map(int, numbers))
kennytm 2010年

2
我认为目前列表理解方法更受青睐。
Extraneon 2010年

3
@extraneon:是的……或者也许考虑使用生成器而不是列表,这取决于您将使用它的目的。生成器的优点是,如果您不需要查看所有元素,则不必浪费时间预先计算它们。
马克·拜尔斯

4
在Python 2.7.2下使用timeit测量:LC:3.578153133392334,map:4.9065070152282715
AJJ 2012年

1
@AJJ:map具有较高的设置开销,但是在参考解释器上,如果transform函数是用C实现的Python内置函数,则每项成本较低。仅对四个值的输入进行测试不会提供有关缩放的有用信息。就是说,在我自己的测试中(在Py2.7.12和Py3.5.2上,Py3.5.2具有list()环绕),Py2 map甚至在四个元素输入上均获胜,而在Py3上仅损失了很小的余量;我怀疑您的测试偏向于listcomps。
ShadowRanger

21

只是一点

numbers = [int(x) for x in numbers]

列表理解更自然,而

numbers = map(int, numbers)

是比较快的。

在大多数情况下,这可能无关紧要

有用的读物​​:LP vs地图


6
它不应该是number = map(int,number)吗?
卡兰2015年

9

如果打算将这些整数传递给函数或方法,请考虑以下示例:

sum(int(x) for x in numbers)

这种构造有意显着地类似于adamk提到的列表理解。没有方括号,它称为生成器表达式,是一种将内存列表传递给方法的非常节省内存的方法。这里有一个很好的讨论:生成器表达式与列表理解


4

在Python 3中制作的另一种方法:

numbers = [*map(int, numbers)]


1
你能解释一下吗?我不熟悉该语法。谢谢!
abalter

1
我使用的拆包参数列表(docs.python.org/3/tutorial/...
zhukovgreen

啊哈,python 3东西。[]接受参数列表似乎很奇怪。而且,我不知道您可以将迭代器作为参数列表传递。我本来想做的number = list(map(int, numbers))。但是,谢谢您的解释!
abalter


1

以为我会合并答案并显示一些timeit结果。

Python 2在这方面很糟糕,但是map比理解要快一点。

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

Python 3本身的速度要快4倍以上,但是将map生成器对象转换为列表仍然比理解要快,并且通过解压缩map生成器来创建列表(感谢Artem!)仍然要快一些。

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

注意:在Python 3中,似乎4个元素是交叉点(在Python 2中为3个),尽管对于生成一个以上元素的列表而言,解压缩生成器仍然比任何一个都快,但理解速度稍快一些。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.