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

Call int() function on every list element?

我有一个带有数字字符串的列表,比如:

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

我想把每个列表元素都转换成整数,所以看起来是这样的:

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

我可以用一个循环来完成,就像这样:

1
2
3
4
new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

一定要这么难看吗?我相信在一行代码中有一种更为Python式的方法可以做到这一点。请帮帮我。


这就是列表理解的目的:

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


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

1
numbers = map(int, numbers)

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

1
numbers = list(map(int, numbers))


只是一点,

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

列表理解更自然,而

1
numbers = map(int, numbers)

更快。

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

有用的阅读:LP vs MAP


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

1
sum(int(x) for x in numbers)

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


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

埃多克斯1〔2〕


另一种方式,

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


我想我会巩固答案并展示一些timeit结果。

python 2在这方面很差劲,但是map比理解要快一些。

1
2
3
4
5
6
7
8
9
10
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!)稍微快一点。

1
2
3
4
5
6
7
8
9
10
11
12
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个以上元素的列表的解包速度快。