Подтвердить что ты не робот

Есть ли лучший способ написать эту "if" логическую оценку?

У меня есть этот небольшой фрагмент кода python, который я написал. Он работает, но я думаю, что должен быть более оптимизированный метод для достижения тех же результатов. Я просто не вижу этого. Любые идеи?

if tx_avt >= 100: tx = 1 
elif tx_avt < 100 and tx_avt >= 50: tx = 2 
elif tx_avt < 50 and tx_avt >= 25: tx = 3
elif tx_avt < 25 and tx_avt >= 12.5: tx = 4 
else: tx = 5
4b9b3361

Ответ 1

Вы можете изменить его на:

if tx_avt >= 100: tx = 1 
elif tx_avt >= 50: tx = 2 
elif tx_avt >= 25: tx = 3
elif tx_avt >= 12.5: tx = 4 
else: tx = 5

Объяснение:

  • Если if tx_avt >= 100 не является истинным, вы можете сделать вывод, что tx_avt < 100 должен быть истинным.
  • Это устраняет необходимость делать часть "tx_avt < 100" в чеке "elif tx_avt < 100 and tx_avt >= 50:".

Такая же логика каскадируется и применяется к остальным случаям elif.


Связанное чтение: Почему у Python нет инструкции Switch и ее альтернативы.

Ответ 2

вам не нужны верхние границы для elifs, так как они разрешены предложением выше их...

elif tx_avt >= 50 : #do something
elif tx_avt >= 25 : #somthing else

на боковой ноте в python вы можете сделать

if 3 < ab < 10 : #check if ab is between 3 and 10

Ответ 3

Если ваша цепочка if-elif-else становится очень длинной, вы можете использовать этот метод:

for amt, tx in [(100, 1), (50, 2), (25, 3), (12.5, 4)]:
    if tx_avt >= amt:
        break
else:
    tx = 5

note: Предложение else цикла for выполняется, когда break не встречается. В этом случае он используется для обеспечения случая по умолчанию.

Ответ 4

Чтобы дать другую идею, это можно сделать в одном лайнере, используя функцию бинарного поиска в модуле bisect.

In [106]: def index(a,x):
   .....:         return len(a) - bisect.bisect_right(a, x) + 1
   .....:

In [107]: a=[12.5,25,50,100]

In [108]: index(a,15)
Out[108]: 4

In [109]: index(a,25)
Out[109]: 3

In [110]: index(a,35)
Out[110]: 3

In [111]: index(a,50)
Out[111]: 2

In [112]: index(a,100)
Out[112]: 1

Ответ 5

Еще одна идея, основанная на том, что [12.5, 25, 50, 100] представляет собой серию:
MAX_BOUNDARY = 5
for tx, boundary in [(n, 25 * 2**(-n+3)) for n in range(1, MAX_BOUNDARY)]:
    if tx_avt >= boundary:
        break
else:
    tx = MAX_BOUNDARY

(Это немного измененная версия @StevenRumbalski)

Это может быть объединено с идеей @WaiYipTung о bisect для поиска O (log (n)), если распределение tx_avt равномерно (функция серии w.r.t.), и ваш список становится ОЧЕНЬ большим.

В противном случае вы должны придерживаться более простых и понятных решений, таких как @JoranBeasley и @SampsonChen.