2009-06-23 64 views

回答

16

没有一个内置的,但它不是要拼命滚你自己:

def TrueXor(*args): 
    return sum(args) == 1 

由于“[B] ooleans是普通的一个亚型整数“(source),你可以很容易地总结整数列表,你也可以将真正的布尔值传递给这个函数。

所以这两个电话是均匀:

TrueXor(1, 0, 0) 
TrueXor(True, False, False) 

如果你想明确的布尔转换:sum(bool(x) for x in args) == 1

+0

我喜欢这样 - 也许你可以更新它将args转换为bools吗? – 2009-06-23 13:11:16

+2

我想你的意思是写``sum(bool(a)for a args)== 1`` - 变量本身可能不是布尔值。 – elo80ka 2009-06-23 13:13:46

+0

我只是喜欢单行。我刚刚学到了一些关于布尔的新东西。 – Deon 2009-06-23 13:13:50

3
>>> 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 
>>> 
1

您链接的问题已经为两个变量提供了解决方案。所有你需要做的就是扩展它来处理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 
1

这是我的直接方法。我已经将它更名为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 
7

我认为基于总和的解决方案是罚款给定的例子,但请记住,在Python布尔谓词总是短路自己的评价。所以你可能想要考虑一些与all and any更一致的东西。

def any_one(iterable): 
    it = iter(iterable) 
    return any(it) and not any(it) 
相关问题