检查列表中是否仅一个变量被设置

20 投票
5 回答
10706 浏览
提问于 2025-04-15 12:27

我想找一个简单的方法来检查在一组变量中,是否只有一个变量的值是True(真)。我看过这个逻辑异或的帖子,现在想找个办法来适应多个变量,并且确保只有一个是True。

举个例子

>>>TrueXor(1,0,0)
True

>>>TrueXor(0,0,1)
True

>>>TrueXor(1,1,0)
False

>>>TrueXor(0,0,0,0,0)
False

5 个回答

5

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,可能会出现一些错误信息,或者程序没有按照预期的方式运行。这些情况可能让人感到困惑,但其实它们都是可以解决的。

首先,了解错误信息是很重要的。错误信息通常会告诉你哪里出了问题,虽然有时候它们的表述可能比较复杂,但仔细阅读通常能找到线索。其次,查阅相关的文档或社区讨论也是一个好办法,很多时候别人已经遇到过类似的问题,并且分享了解决方案。

另外,调试代码也是一个重要的技能。通过逐步检查代码的运行情况,可以找到问题的根源。记得保持耐心,编程本身就是一个不断学习和解决问题的过程。

总之,遇到问题时不要气馁,利用好错误信息、文档和调试工具,你一定能找到解决办法。

>>> 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
>>>
10

我觉得基于求和的解决方案对于这个例子来说是可以的,但要记住,在Python中,布尔条件的计算是短路的。这意味着在某些情况下,程序不会检查所有条件,只会检查到第一个能决定结果的条件。所以你可能想考虑一些和all和any更一致的方法。

def any_one(iterable):
    it = iter(iterable)
    return any(it) and not any(it)
27

虽然没有现成的功能,但自己写一个也不难:

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

因为“布尔值是普通整数的一种子类型”(来源),所以你可以很简单地对整数列表进行求和,同时也可以把真正的布尔值传入这个函数。

所以这两个调用是相同类型的:

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

如果你想要明确的布尔值转换,可以使用:sum( bool(x) for x in args ) == 1

撰写回答