Вызов функции 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 способ сделать это в одну строку кода. Пожалуйста, помогите мне.
7 ответов:
Это списочные включения для:
numbers = [ int(x) for x in numbers ]
просто точка,
numbers = [int(x) for x in numbers]понимание списка более естественно, в то время как
numbers = map(int, numbers)быстрее.
вероятно, это не будет иметь значения в большинстве случаев
полезно читать: LP vs map
Если вы собираетесь передать эти целые числа в функцию или метод, рассмотрим следующий пример:
sum(int(x) for x in 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генератор (Спасибо Артем!) еще немного быстрее.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 элемента кажется чтобы быть точкой пересечения (3 в Python 2), где понимание немного быстрее, хотя распаковка генератора все еще быстрее, чем для списков с более чем 1 элементом.
Comments