Python 对每个列表元素调用int()函数?

Python 对每个列表元素调用int()函数?,python,list,type-conversion,integer,Python,List,Type Conversion,Integer,我有一个带有数字字符串的列表,如下所示: numbers = ['1', '5', '10', '8']; new_numbers = []; for n in numbers: new_numbers.append(int(n)); numbers = new_numbers; 我想将每个列表元素转换为整数,因此它看起来如下所示: numbers = [1, 5, 10, 8]; 我可以使用循环来完成,如下所示: numbers = ['1', '5', '10', '8'];

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

numbers = ['1', '5', '10', '8'];
new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;
我想将每个列表元素转换为整数,因此它看起来如下所示:

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风格的方法来实现这一点。请帮帮我。

这就是我们的目的:


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

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

numbers = list(map(int, numbers))
另一方面,

for i, v in enumerate(numbers): numbers[i] = int(v)

如果你打算将这些整数传递给函数或方法,请考虑这个例子:

sum(int(x) for x in numbers)
这种结构有意地与adamk提到的列表理解非常相似。没有方括号,它被称为生成器表达式,是一种非常节省内存的方法,可以将参数列表传递给方法。这里有一个很好的讨论:

只是一点

numbers = [int(x) for x in numbers]
列表理解更自然,而

numbers = map(int, numbers)
速度更快

在大多数情况下,这可能并不重要


有用的阅读:

在Python 3中实现它的另一种方法:


numbers=[*map(int,numbers)]
我想我应该合并答案,并显示一些
timeit
结果

Python2在这方面非常糟糕,但是
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
Python3本身的速度快了4倍多,但是将
map
generator对象转换为列表仍然比理解快,而通过解包
map
generator(感谢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

注意:在Python3中,4个元素似乎是交叉点(Python2中的3个元素),在这里理解速度稍快,但对于包含1个以上元素的列表,解包生成器仍然比这两个元素都快。

可能还值得注意的是,NumPy在创建数组时会动态完成这项工作:

将numpy导入为np
数字=['1','5','10','8']
数字=np.数组(数字,
dtype=int)
数字

在Python3.x中,
map
返回一个迭代器而不是一个列表,因此如果需要列表,它需要写成
list(map(int,numbers))
。我认为目前列表理解方法更受欢迎。@extranon:是的。。。或者考虑使用一个生成器而不是一个列表,这取决于你将使用它。生成器的优点是,如果您可能不需要查看所有元素,那么就不必浪费时间提前计算它们。9065070152282715@AJJ:
map
具有较高的设置开销,但在参考解释器上,如果transform函数是用C实现的Python内置函数,则它的每项成本较低。仅对四个值的输入进行测试不会提供有关缩放的有用信息。也就是说,在我自己的测试中(在Py2.7.12和Py3.5.2上,后者带有
list()
包装),带有
map
的Py2即使在四元素输入上也赢了,在Py3上只输了一小部分;我怀疑您的测试偏向于listcomps。您使用的是什么版本的Python?如果您希望只对列表中的某些元素执行操作,这种方法非常有用。这与本线程中的问题无关,但在某些情况下,它是有帮助的,不是应该是number=map(int,number)吗?你能解释一下吗?我不熟悉这种语法。谢谢我正在使用解包参数列表()Aha,一个python3的东西。让
[]
获取参数列表似乎很奇怪。我不知道可以将迭代器作为参数列表传递。我本想做
number=list(map(int,numbers))
。但是谢谢你的解释!向我显示无效语法
array([ 1,  5, 10,  8])