В Python есть способ превратить 1.0
в целое число 1
то время как та же функция игнорирует 1.5
и оставляет его как число с float
?
Прямо сейчас int()
превратит 1.0
в 1
но также округлит 1.5
до 1
, что мне не нужно.
В Python есть способ превратить 1.0
в целое число 1
то время как та же функция игнорирует 1.5
и оставляет его как число с float
?
Прямо сейчас int()
превратит 1.0
в 1
но также округлит 1.5
до 1
, что мне не нужно.
Продолжая комментарии выше:
Использование is_integer()
:
Пример из документов:
>>> (1.5).is_integer()
False
>>> (1.0).is_integer()
True
>>> (1.4142135623730951).is_integer()
False
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
ВВОД:
s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]
Отсюда:
print([int(x) if x.is_integer() else x for x in s])
Завернут в функцию:
def func(s):
return [int(x) if x.is_integer() else x for x in s]
print(func(s))
Если вы не хотите import
:
def func(s):
return [int(x) if x == int(x) else x for x in s]
print(func(s))
Используя map()
с lambda
функцией и т.е. s
:
print(list(map(lambda x: int(x) if x.is_integer() else x, s)))
ИЛИ ЖЕ
print(list(map(lambda x: int(x) if int(x) == x else x, s)))
ВЫХОД:
[1.5, 1, 2.5, 3.54, 1, 4.4, 2]
Если ваша цель - преобразовать числа в сжатую строку, вы можете просто использовать '%g'
("Общий формат") для форматирования:
>>> '%g' % 1.0
'1'
>>> '%g' % 1
'1'
>>> '%g' % 1.5
'1.5'
>>> '%g' % 0.3
'0.3'
>>> '%g' % 0.9999999999
'1'
Вы можете указать желаемую точность:
>>> '%.15g' % 0.999999999999999
'0.999999999999999'
>>> '%.2g' % 0.999
'1'
float.is_integer
- это метод для чисел с плавающей точкой, который возвращает, представляет ли число с плавающей точкой целое число.
Вы можете просто использовать эту функцию, которую я назвал to_int
, которая использует is_integer
чтобы проверить, представляет ли она целое число (например, 1.0
) или нет (например, 1.5
).
Если оно представляет целое число, верните int(a)
, в противном случае просто верните его исходное значение.
Как видите, я не использую elif
или else
потому что return
выходит из функции:
def to_int(a):
if a.is_integer():
return int(a)
return a
print(to_int(1.5))
print(to_int(1.0))
Выход:
1.5
1
Плавания Python являются приблизительными, поэтому то, что печатается как 1.0
, не обязательно точно 1.0
. Если вы хотите увидеть, является ли что-то приблизительно целым, используйте достаточно малое значение эпсилона.
EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy
def func(x):
if abs(x - round(x)) < EPSILON:
return round(x)
else:
return x
В общем, если вы проверяете, является ли число с плавающей точкой ==
для чего-либо, это имеет тенденцию быть запахом кода, поскольку значения с плавающей запятой по своей природе являются приблизительными. В целом более уместно проверить, находится ли поплавок рядом с чем-либо, в пределах некоторого эпсилон-диапазона.
Простая вещь, которую вы можете сделать, это использовать оператор по модулю:
if (myFloat % 1 == 0) // Number is an int
else // numer is not an int
РЕДАКТИРОВАТЬ: код Python
if myFloat % 1 == 0:
# myFloat is an integer.
else:
# myFloat is NOT an integer
для списка номеров:
def get_int_if_possible(list_of_numbers):
return [int(x) if x == int(x) else x for x in list_of_numbers]
за один номер:
def get_int_if_possible(number):
return int(number) if number == int(number) else number
То, что я делал в прошлом в C++, скажем, у вас есть эти переменные:
float x = 1.5;
float y = 1.0;
Тогда вы можете сделать что-то вроде этого:
if(x == (int)x)
return 1;
else return 0;
Это вернет 0, потому что 1,5 не равно 1
if(y == (int)y)
return 1;
else return 0;
Это вернет 1, потому что 1,0 равно 1
Конечно, ваш вопрос о Python, и функция is_integer()
должна работать отлично, я просто подумал, что некоторые люди могут найти это полезным.
Безопасный подход с использованием lambda
и is_integer()
:
>>> to_int = lambda x: int(x) if float(x).is_integer() else x
>>> to_int(1)
1
>>> to_int(1.0)
1
>>> to_int(1.2)
1.2
>>>
def your_function(i):
if i.is_integer():
return int(i)
else:
return float(i)
Ответ на вопрос в том виде, в котором он задан, требует сравнения значения с плавающей запятой. Всегда нужно избегать операций равенства на поплавках. Некоторая форма округления является допустимым подходом.
Но для такого случая использования модуль decimals - ваш друг. Десятичные числа имеют преимущество абсолютной точности для значений, указанных в вопросе, по сравнению с числами с плавающей запятой, а также достигают абсолютно надежных результатов в операциях сравнения.
альтернатива divmod
:
def f(x):
return x if divmod(x, 1)[1] else int(x)
если вы ищете прямой подход без использования .is_integer()
?
is_integer - это метод для float, который вы можете проверить,
dir(float) #eg dir(1.0)
будет список методов, доступных для float, включая .is_integer()
Теперь перейдем к делу...
Прямой подход:
int(float_num) -> will return int so do direct comparison
синтаксис: int(num) == num → int(num) otherwise → num
скрипт: n = int(num) if int(num) == num else num
например:
num = 1.5
n = int(num) if int(num) == num else num
print n
>>> 1.5
Как функция,
>>> def num_con(n):
... return int(n) if int(n) == n else n
Sample Input/output:
>>> num_con(1.0)
1
>>> num_con(1.5)
1.5
>>> num_con(2.5)
2.5
>>> num_con(2.0)
2
>>>
так же, как список номеров,
а) одна строка:
[int(i) if int(i) == i else i for i in [1.5,2.0,3.2,4.0,5.5]]
б) повторное использование функции:
[num_con(i) for i in [1.5,2.0,3.2,4.0,5.5]] #num_con is a function which we wrote on top