Вызов функции 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 способ сделать это в одну строку кода. Пожалуйста, помогите мне.

467   7  

7 ответов:

Это списочные включения для:

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

В Python 2.х другой подход заключается в использовании map:

numbers = map(int, numbers)

Примечание: в Python 3.x map возвращает объект карты, который можно преобразовать в список, если вы хотите:

numbers = list(map(int, numbers))

просто точка,

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

понимание списка более естественно, в то время как

numbers = map(int, numbers)

быстрее.

вероятно, это не будет иметь значения в большинстве случаев

полезно читать: LP vs map

Если вы собираетесь передать эти целые числа в функцию или метод, рассмотрим следующий пример:

sum(int(x) for x in numbers)

эта конструкция намеренно удивительно похожа на список постижений, упомянутых Адамом. Без квадратных скобок, это называется выражение генератор, и это очень эффективный для памяти способ передачи списка аргументов в метод. Хорошая дискуссия доступна здесь:генератор выражений против понимания списка

другой путь,

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

другой способ сделать это в Python 3:

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 генератор (Спасибо Артем!) еще немного быстрее.

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

    Ничего не найдено.