2012-08-15 5 views
4

У меня есть около 10 булевых переменных, мне нужно установить новую логическую переменную x=True, если все эти десять значений переменных являются True. Если один из них False, тогда установите x= False I может сделать это способомПроверьте сразу логические значения из набора переменных

, который, очевидно, выглядит очень уродливым.Пожалуйста, предложите еще несколько решений для pythonic.

Уродливый часть a and b and c and d and e and f...

+0

Также обратите внимание (как и все нижеприведенные ответы), что 'if' /' else' не нужно, просто присвойте значение оценки вместо 'x'. – Kimvais

ответ

9

Предполагая, что у вас есть Bools в списке/кортеж:

x = all(list_of_bools) 

или просто как это было предложено @minopret

x= all((a, b, c, d, e, f)) 

пример:

>>> list_of_bools = [True, True, True, False] 
>>> all(list_of_bools) 
False 
>>> list_of_bools = [True, True, True, True] 
>>> all(list_of_bools) 
True 
+0

Должен ли я сначала создать список? со всеми этими переменными –

+5

Правильно, вы можете просто написать список или кортеж inline: 'all ((a, b, c, d, e, f))' – minopret

0
x = a and b and c and d and e ... 

Если это то, что нужно было бы вычислить много раз, рассмотрите возможность использования функции, которая получает все логические значения (предпочтительнее как список или кортеж, не предполагая ничего о его размере).

+1

, и эта функция называется 'all()'. –

1

Хотя использование all в Python one and preferably only obvious way to do it, здесь другой подход, чтобы сделать то же самое с помощью функции and_ из operator модуля и уменьшить

>>> a = [True, True, False] 
>>> from operator import and_ 
>>> reduce(and_, a) 
False 
>>> b = [True, True, True] 
>>> reduce(and_, b) 
True 

Edit: Как отметил Дункан, and_ является побитовый & оператор, а не логический and. Он будет работать только для булевых значений, поскольку они будут отлиты от int (1 или 0)

Просматривая комментарии, нужно действительно использовать BIF all для достижения того, что задал ОП. Мне хотелось добавить это как ответ, потому что иногда я нахожу его полезным, например, для создания сложных db-запросов в Django с использованием объектов Q и в некоторых других случаях.

+0

-1 - чуть больше _pythonic_, потому что он гораздо менее читабельен, чем 'all()'. На самом деле он менее читабельен, чем прикованный 'и' – Kimvais

+0

согласился с тем, что он меньше pythonic по сравнению с 'all()', но я думаю, что любой, кто понимает, что 'reduce' применяет функцию к двум элементам итерации и уменьшает ее 1, он должен иметь прекрасный смысл – naiquevin

+0

Да, вы правы. Однако не использование 'all()' против не менее 3 стихов Zen of Python ... – Kimvais

1
is_all_true = lambda *args:all(args) 

a = True 
b = True 
c = True 

print is_all_true(a,b,c) 
Смежные вопросы