2016-04-04 5 views
-2

У меня есть список и два значения для сравнения:итерация списка через кратному, если заявление в питоне

mylist = [98, 10, 12] 
w = 85 
c = 90 

for i in mylist: 
    if i <= w: 
     status = "OK" 
    elif i >= w and i < c: 
     status = "WARNING" 
    elif i >= c: 
     status = "CRITICAL" 

print status 

Условия является: а) Если все элементы в списке меньше, чем вес и с, должны распечатать OK. b) Если какой-либо из элементов больше w и меньше c, следует распечатать WARNING. c) Если какой-либо из элементов больше c, следует распечатать CRITICAL.

Этот код распечатывает OK, однако должен печатать CRITICAL.

+5

Не удается воспроизвести, два 'OK's и три' CRITICAL's напечатаны. –

+2

Либо вы не показываете нам фактический код, либо у вас есть новое и интересное определение «stop». –

+0

есть ли, возможно, 'break' или' return' где-то еще в самом цикле? оба остановили бы цикл. –

ответ

1

Вы заменяете значение для status каждой итерации, так что вы effectivly просто проверить последний элемент в списке, и это ниже w поэтому он печатает OK.

Учитывая ваш подход, очевидный способ его фиксации состоит в том, чтобы сломать for -loop, как только одно значение является критическим, и не проверять OK, как только один элемент уже вызвал предупреждение.

mylist = [98, 10, 12] 
w = 85 
c = 90 
status = 'OK' # assume it's ok until you found a value exceeding the threshold 
for i in mylist: 
    if status == 'OK' and i < w: # Only check OK as long as the status is ok 
     status = "OK" 
    elif i >= w and i < c: 
     status = "WARNING" 
    elif i >= c: 
     status = "CRITICAL" 
     break # End the loop as soon as a value triggered critical 

print status 

Помимо этого предложения я хотел бы предложить просто найти значение max и сравнить его:

maximum = max(mylist) 
if maximum < w: 
    status = 'OK' 
elif maximum < c: 
    status = 'WARNING' 
else: 
    status = 'CRITICAL' 
+1

Предложение использовать' max' на самом деле лучший ответ на этот вопрос. Не нужно проверять каждое значение, если вы только заботитесь о самом высоком значении статуса. – Blckknght

0

Как насчет следующего:

def check(mylist): 
    w, c = 0.85, 0.90 
    if any(x >= c for x in mylist): 
     # there is an element larger than c 
     return "CRITICAL" 
    elif any(x >= w for x in mylist): 
     # there is an element larger than w 
     return "WARNING" 
    else: 
     return "OK" 

затем:

>>> check([98, 10, 12]) 
'CRITICAL'