Вызывать функцию int () для каждого элемента списка? - PullRequest
162 голосов
/ 30 июля 2010

У меня есть список с числовыми строками, например:

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

Я хотел бы преобразовать каждый элемент списка в целое число, чтобы оно выглядело так:

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

Я мог бы сделать это с помощью цикла, например:

new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

Это должно быть так ужасно? Я уверен, что есть более питонский способ сделать это в одной строке кода. Пожалуйста, помогите мне.

Ответы [ 7 ]

320 голосов
/ 30 июля 2010

Вот для чего список пониманий для:

numbers = [ int(x) for x in numbers ]
122 голосов
/ 30 июля 2010

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

numbers = map(int, numbers)

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

numbers = list(map(int, numbers))
17 голосов
/ 31 июля 2010

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

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

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

numbers = map(int, numbers)

быстрее.

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

Полезное чтение: LP против карты

9 голосов
/ 30 июля 2010

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

sum(int(x) for x in numbers)

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

3 голосов
/ 04 октября 2016

Еще один способ сделать это в Python 3:

numbers = [*map(int, numbers)]

3 голосов
/ 30 июля 2010

Другой способ,

for i, v in enumerate(numbers): numbers[i] = int(v)
0 голосов
/ 11 апреля 2018

Думаю, я соберу ответы и покажу некоторые результаты 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 элементом..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...