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

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

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化的方法可以在一行代码中实现这一点。请帮帮我。

329020 次浏览

这就是列表理解的作用:

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

在Python 2中。x另一种方法是使用map:

numbers = map(int, numbers)

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

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)

更快。

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

有用的阅读:LP vs map

在Python 3中另一种方法是:

numbers = [*map(int, numbers)]

然而,理想情况下,你可能只满意map,因为它返回一个迭代器:

numbers = map(int, numbers)

我想我将巩固答案并显示一些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),其中理解略快,尽管对于包含超过1个元素的列表,解包生成器仍然比任何一个都快。

可能还值得注意的是,NumPy在创建数组时会动态地执行此操作:

import numpy as np


numbers = ['1', '5', '10', '8']
numbers = np.array(numbers,
dtype=int)
numbers
array([ 1,  5, 10,  8])