2014-12-02 5 views
-2

Я пытаюсь выполнить цикл над массивом, пропуская некоторые типы продуктов. Проблема в том, что она не пропускает их. То же самое происходит независимо от типа продукта в списке пропуска или нет.Условия множественного условия IF в python

for i in source: 
    if (i["product_type"] == 00 and i["product_type"] == 35 and i["product_type"] == 72): 
     print i["product_name"] + " has been skipped" 
    else: 
     # Upload product 
+7

вы имели в виду 'or' вместо' and'? Конечно, product_type может быть только одним, он не может быть 00, 35 и 72 одновременно. – nos

ответ

2

Проблема в том, что вы просто не можете иметь все эти условия в одном утверждении. Один элемент не может иметь несколько значений для одного и того же атрибута. Ваша переменная i имеет только один атрибут product_type так, что вы на самом деле ищете способ, чтобы проверить против какой-либо один из вариантов:

if i["product_type"] == 0 or i["product_type"] == 35 or i["product_type"] == 72: 
    # 

Вы хотите использовать оператор or вместо оператора and.

Здесь гораздо более читабельным версия кода (при условии, что стоимость вашего типа продукта INT:

if i["product_type"] in [ 0, 35, 72 ]: 
    print i["product_name"] + " has been skipped" 
else: 
    # Upload product 

Этот код проверяет, является ли значение product_type упоминается в списке:
[ "00", "35", "72" ] .


в качестве последнего замечания, вы не обязаны обернуть условный оператор с parethesis (как вы с JS/PHP, например), вы можете просто опустить их:.

if "foo" in [ "foo" ]: 
    pass 

работает так же, как

if ("foo" in [ "foo" ]): 
    pass 
+0

Значения в вашем списке во втором альтернативе должны быть ints not strings – CoryKramer

+0

@Cyber ​​- как может '00' быть int? – Lix

+1

, потому что они используют Python 2.x, посмотрите на их утверждение 'print' .... oh Я получаю вашу точку зрения, да, это будет интерпретироваться как« восьмеричный »(хотя для' 0' им повезло) – CoryKramer

0

Вы должны or их вместе вместо and, так как i["product_type"] может иметь только одно значение, я предполагаю, что это просто опечатка.

if (i["product_type"] == 0 or i["product_type"] == 35 or i["product_type"] == 72): 

Однако проще и более лаконичным использовать следующие

if i["product_type"] in (0, 35, 72): 
+0

Есть ли разница между использованием кортежа и списком для включения опций? – Lix

+1

@ Lix Нет, не очень. Я полагаю, что если бы было много элементов для проверки, было бы лучше использовать набор, подобный '{0, 35, 72}' для более быстрого поиска членства, но в этом случае это тривиально. – CoryKramer

+0

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

Смежные вопросы