Проверьте, установлена ли только одна переменная в списке переменных
Вопрос
Я ищу простой способ проверить, имеет ли только одна переменная в списке переменных значение True.Я посмотрел на это логический пост xor и пытается найти способ адаптироваться к множеству переменных и только одной истинной.
Пример
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Решение
Встроенной системы нет, но ее нетрудно установить самостоятельно:
def TrueXor(*args):
return sum(args) == 1
Поскольку «[b]ooleans являются подтипом простых целых чисел» (источник) вы можете довольно легко суммировать список целых чисел, а также передавать в эту функцию истинные логические значения.
Итак, эти два вызова однородны:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Если вы хотите явное логическое преобразование: sum( bool(x) for x in args ) == 1
.
Другие советы
Я думаю, что решение на основе суммы подходит для данного примера, но имейте в виду, что логические предикаты в Python всегда сокращают свою оценку.Поэтому вы можете рассмотреть что-то более соответствующее все и любой.
def any_one(iterable):
it = iter(iterable)
return any(it) and not any(it)
>>> def f(*n):
... n = [bool(i) for i in n]
... return n.count(True) == 1
...
>>> f(0, 0, 0)
False
>>> f(1, 0, 0)
True
>>> f(1, 0, 1)
False
>>> f(1, 1, 1)
False
>>> f(0, 1, 0)
True
>>>
Вопрос, на который вы ссылаетесь, уже дает решение для двух переменных.Все, что вам нужно сделать, это расширить его для работы с n переменными:
import operator
def only_one_set(*vars):
bools = [bool(v) for v in vars]
return reduce(operator.xor, bools, False)
>>> a, b, c, d, e = False, '', [], 10, -99
>>> only_one_set(a, b, c, d)
True
>>> only_one_set(a, b, c, d, e)
False
Вот мой прямой подход.Я переименовал его only_one, поскольку xor с более чем одним входом обычно является проверкой четности, а не проверкой «только одного».
def only_one(*args):
result = False
for a in args:
if a:
if result:
return False
else:
result = True
return result
Тестирование:
>>> only_one(1,0,0)
True
>>> only_one(0,0,1)
True
>>> only_one(1,1,0)
False
>>> only_one(0,0,0,0,0)
False
>>> only_one(1,1,0,1)
False