Есть ли более элегантный способ уменьшить эту позитивную / негативную логику? - PullRequest
0 голосов
/ 09 октября 2018

Есть ли более элегантный способ уменьшить приведенный ниже код, который должен изменять направление слева направо и наоборот, исходя из размера строки?

if right_length > left_length:
    direction = -1
elif right_length < left_length:
    direction = 1
else:
    direction = 0

Ответы [ 5 ]

0 голосов
/ 09 октября 2018

Компактное и элегантное определение функции, если вам нужно повторно использовать код, может быть таким:

f = lambda x,y: 1 if x<y else -1 if x>y else 0

direction = f(right_length, left_length)
0 голосов
/ 09 октября 2018

Вы можете использовать печать с двумя условными выражениями

print(1 if r_len > l_len else -1 if l_len > r_len else 0)
0 голосов
/ 09 октября 2018

Может быть что-то вроде:

def direction(right_length, left_length):
    diff = left_length - right_length
    return int(abs(diff) / diff) if diff else 0

print(direction(5, 10)) # 1
print(direction(10, 5)) # -1
print(direction(1, 1)) # 0
0 голосов
/ 09 октября 2018

Вы можете уменьшить 3 оператора ветвления до 2, если используете функцию math.copysign:

import math
direction = 0 if left == right else math.copysign(1, left - right)

copysign скопирует знак left - right и применяет его клевый операнд (в данном случае 1).

Если left и right являются числами с плавающей запятой, используйте math.isclose для проверки близости, учитывающей плавающие неточности.

direction = 0 if math.isclose(left, right) else math.copysign(1, left - right)

Если у вас есть numpy, вы можете обработать специальный случай left == right с самой функцией, используя np.sign:

import numpy as np
direction = np.sign(left - right)
0 голосов
/ 09 октября 2018

Вам нужна функция cmp (сравнить) из пакета math.На других языках аналогичная функция называется sign.Сообщество Python не имело четкого консенсуса по крайним случаям и до сих пор оставило sign вне языка.

direction = cmp(left_length, right_length)

Я думаю, что это устарело в Python 3. В этом случае используйтеnumpy.sign

Для Python 3 без numpy вы можете сделать

diff = left_length - right_length
print (math.copysign(1, diff) if diff else 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...