У меня есть список с числовыми строками, вот так:
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 2.x другой подход заключается в использовании
map
:Примечание: в Python 3.x
map
возвращается объект карты, который вы можете преобразовать в список, если хотите:источник
map
возвращает итератор вместо списка, поэтому его нужно записать так, какlist(map(int, numbers))
если бы он был нужен.map
имеет более высокие накладные расходы на установку, но в ссылочном интерпретаторе, если функция преобразования является встроенной функцией Python, реализованной в C, она имеет меньшую стоимость на единицу. Тестирование на входе только четырех значений не даст полезной информации о масштабировании. Тем не менее, в моих собственных тестах (на Py2.7.12 и Py3.5.2, последний сlist()
переносом), Py2map
выиграл даже для четырехэлементных входов и проигрывает лишь с небольшим отрывом от Py3; Я подозреваю, что ваши тесты были искажены в пользу списков.просто точка,
понимание списка более естественно, в то время как
быстрее.
Вероятно, это не будет иметь значения в большинстве случаев
Полезно читать: LP против карты
источник
Если вы намереваетесь передать эти целые числа в функцию или метод, рассмотрите этот пример:
Эта конструкция намеренно удивительно похожа на списки, упомянутые Адамком. Без квадратных скобок это называется выражением генератора , и это очень эффективный способ передачи списка аргументов методу. Хорошее обсуждение доступно здесь: выражения генератора и понимание списка
источник
Еще один способ сделать это в Python 3:
numbers = [*map(int, numbers)]
источник
[]
список аргументов. И я не знал, что вы можете передать итератор в качестве списка аргументов. Я бы подумал сделатьnumber = list(map(int, numbers))
. Но спасибо за объяснение!По-другому,
источник
Думаю, я соберу ответы и покажу некоторые
timeit
результаты.Python 2 плохо справляется с этим, но
map
немного быстрее, чем понимание.Python 3 более чем в 4 раза быстрее сам по себе, но преобразование
map
объекта генератора в список все еще быстрее, чем его понимание, а создание списка путем распаковкиmap
генератора (спасибо Артему!) Еще немного быстрее.Примечание. В Python 3 4 элемента, по-видимому, являются точкой пересечения (3 в Python 2), где понимание происходит немного быстрее, хотя распаковка генератора все же происходит быстрее, чем для списков с более чем 1 элементом.
источник