Самый питонический способ преобразовать список чисел с плавающей запятой fs в список целых чисел – использовать однострочный код fs = [int (x) for x in fs]. Он перебирает все элементы в списке fs, используя понимание списка, и преобразует каждый элемент списка x в целочисленное значение с помощью конструктора int (x).
В этой статье показаны простейшие способы преобразования одномерного списка, состоящего только из чисел с плавающей запятой , в список целых чисел.
Проблема: Дан список чисел с плавающей запятой [1.0, 2.0, 3.0]
. Как его преобразовать в список целых чисел [1, 2, 3]
?
Способы неприменимы к спискам списков. При необходимости можно добавить циклы или определить пользовательские функции.
Метод 1: Список
Предположим у нас есть список:
a = [1.1, 1.2, 1.8, 0.5, 5.9, -2.3]
Проверим тип элементов списка:
print(type(a[0])) # <class 'float'>
Применим встроенную функцию int, получим список состоящий из целых чисел:
print([int(a) for a in a]) # [1, 1, 1, 0, 5, -2]
Проверим тип элементов списка:
A = [int(a) for a in a] print(type(A[0])) # <class ‘int’>
Таким образом, используя встроенную функцию int, которая, преобразуя вещественное число, делает округление в сторону нуля, а вернее будет сказать – отбрасывает дробную часть, мы можем однострочным кодом получить новый список целых чисел.
Метод 2: Функция Map
Встроенная функция map, является хорошо оптимизированной и эффективной, при ее вызове элементы списка извлекаются при обращении, а следовательно в памяти находится и обрабатывается один элемент, что позволяет программе не хранить в памяти системы весь список элементов.
Применим к тому же списку ‘a’ код ниже:
print(list(map(int, a))) # [1, 1, 1, 0, 5, -2]
Проверять тип элементов полученного списка мы не будем, так как при вызове функции ‘map’ передали в нее уже описанную в методе 1 функцию ‘int’ в качестве аргумента, а результат обернули в список применением функции ‘list’.
Метод 3: Функция Round в определении Списка
Он очень схож с первым, но в отличие от ‘int’, он не просто отбрасывает дробную часть, а округляет до ближайшего четного целого числа, если дробная часть равна 0,5. Также можно передать в качестве второго аргумента количество знаков после запятой, до которых необходимо округление, по умолчанию это 0, этим мы и воспользуемся:
print([round(a) for a in a])
Проверим тип чисел нового списка:
D = [round(a) for a in a] print(type(D[0])) # <class ‘int’>
Как видим из этого примера, есть разные встроенные функции для достижения нашей цели, отличие в способе и величине погрешности при округлении.
Метод 4: Модуль Math
В этом способе я предлагаю воспользоваться импортируемым модулем ‘math’, в котором будем использовать три функции ceil()
, floor()
, и trunc()
. Рассмотрим подробнее каждый. Синтаксис у них одинаковый, различие в способе округления.
Применим к изначальному списку:
a = [1.1, 1.2, 1.8, 0.5, 5.9, -2.3] print([math.ceil(a) for a in a]) # [2, 2, 2, 1, 6, -2]
‘Ceil’ округляет к ближайшему большему целому числу с учетом знака(-2.3 < -2 вывод будет True)
Проверим тип чисел в полученном списке:
C = [math.ceil(a) for a in a] print(type(C[0])) # <class ‘int’>
Рассмотрим следующую функцию в модуле ‘math’ – ‘floor’, её действие противоположно ‘ceil’ – округляет в меньшую сторону к ближайшему целому числу:
print([math.floor(a) for a in a]) # [1, 1, 1, 0, 5, -3]
Проверим тип:
F = [math.floor(a) for a in a] print(type(F[0])) # <class ‘int’>
Следующая функция – ‘trunc’, является аналогом встроенной функции ‘int’ – просто отбрасывает дробную часть какая она бы не была:
print([math.trunc(a) for a in a]) # [1, 1, 1, 0, 5, -2]
И снова проверим тип чисел нового списка:
T = [math.trunc(a) for a in a] print(type(T[0])) # <class ‘int’>
Метод 5: NumPy
Здесь рассмотрим преобразование списка из ‘int’ в массив c помощью модуля NumPy. Отличие массива от списка – все элементы массива должны быть одного типа, как “float’ и ‘int’. Числовые операции с большим объемом данных можно проводить с массивами гораздо быстрее и эффективнее чем со списками.
Превратим наш первый список ‘a’ в массив:
import numpy as np N = np.array(a, int)
В функцию array мы передаем два аргумента, имя списка для конвертации в массив и тип для каждого элемента.
# [ 1 1 1 0 5 -2]
Проверим тип элементов:
print(type(N[0])) # <class 'numpy.int32'>
В отличие от типа чисел ‘int’ в Python в модуле NumPy они определены несколько иначе и разделены на несколько подгрупп. Например, ‘int32’ – это целые числа в диапазоне от -2147483648 до 2147483647(4-байтовые числа), ‘int64’ – числа от -9223372036854775808 до 9223372036854775807(8-байтовые числа), также есть различные типы ‘int’ для 32- и 64-битных операционных систем, это обязательно надо учитывать при вычислениях с массивами.