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中,另一种方法是使用
1 | numbers = map(int, numbers) |
号
注意:在python 3.x中,
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) |
。
我想我会巩固答案并展示一些
python 2在这方面很差劲,但是
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倍,但是将
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个以上元素的列表的解包速度快。