Укорочение условного в Python - PullRequest
0 голосов
/ 22 мая 2018

Мне интересно, какой самый краткий способ написать следующее условное выражение?

if not 0.01 < parameters[0] <1. or not 0.01 < parameters[1] <2. or not 0.01 < parameters[2] <0.25 or not 0.01 < parameters[3] <0.25 or not 0.01 < parameters[4] < 0.2
    #do something

Ответы [ 4 ]

0 голосов
/ 22 мая 2018

Быстрый способ упростить множественное or - использовать встроенный Python any.В этом случае вы получите что-то вроде этого:

upper_bounds = [1, 2, 0.25, 0.25, 0.2]
if any([not 0.01 < parameters[i] < up for i, up in enumerate(upper_bounds)]):
    # do something
0 голосов
/ 22 мая 2018

Если вы хотите clear решение, я бы пошел с тем, что Антон написал выше меня.Но, вопрос задан наиболее succinct.Это то, что я придумал.

if len(list(filter(lambda p: p[1] <= 0.01 or p[1] >= [1,2,.25,.25,.2][p[0]],enumerate(parameters)))) != 0:
    print('Do something')
0 голосов
/ 22 мая 2018

Это может быть понятнее или, по крайней мере, легче увидеть, что вы хотите, чтобы значения были между:

floor= 0.01
array = [1,2,0.25,0.25,0.2,0.01]
if not floor < parameters[0] <array[0] 
or 
not floor < parameters[1] <array[1] 
or 
not floor < parameters[2] <array[2] 
or 
not floor < parameters[3] <array[3] 
or 
not floor < parameters[4] < array[4]
0 голосов
/ 22 мая 2018

Вот четкий код, который я бы сказал:

parameters = [0,0,0,0,0]

LBS = [.01, .01, .01, .01, .01]
UBS = [1., 2., .25, .25, .2]

conds = (not (LB < param < UB) for param, LB, UB in zip(parameters, LBS, UBS))

if all(conds):
    # Action

Или более эффективно:

conds = (LB < param < UB for param, LB, UB in zip(parameters, LBS, UBS))

if not any(conds):
    # Action

Или:

if not any(LB < param < UB for param, LB, UB in zip(parameters, LBS, UBS)):

Объяснение:

Позвольте нам поместить все ваши условия в список / генератор путем объединения ваших параметров, нижних границ (LBS) и верхних границ (UBS).

Мы тогдапроверьте, все ли conds имеют значение True с all(conds), и выполните, если True.

...