当前位置: 首页 > 面试题库 >

如何检查列表中只有一个真实值?

訾高飞
2023-03-14
问题内容

在python中,我有一个列表,该列表应 仅包含一个 真实值(即bool(value) is True)。有一个聪明的方法来检查吗?现在,我只是遍历整个列表并手动检查:

def only1(l)
    true_found = False
    for v in l:
        if v and not true_found:
            true_found=True
        elif v and true_found:
             return False #"Too Many Trues"
    return true_found

这看起来不雅,不是很pythonic。有更聪明的方法吗?


问题答案:

最冗长的解决方案并不总是最简单的解决方案。因此,我仅添加了一个较小的修改(以节省一些冗余的布尔值评估):

def only1(l):
    true_found = False
    for v in l:
        if v:
            # a True was found!
            if true_found:
                # found too many True's
                return False 
            else:
                # found the first True
                true_found = True
    # found zero or one True value
    return true_found

以下是一些比较时间:

# file: test.py
from itertools import ifilter, islice

def OP(l):
    true_found = False
    for v in l:
        if v and not true_found:
            true_found=True
        elif v and true_found:
             return False #"Too Many Trues"
    return true_found

def DavidRobinson(l):
    return l.count(True) == 1

def FJ(l):
    return len(list(islice(ifilter(None, l), 2))) == 1

def JonClements(iterable):
    i = iter(iterable)
    return any(i) and not any(i)

def moooeeeep(l):
    true_found = False
    for v in l:
        if v:
            if true_found:
                # found too many True's
                return False 
            else:
                # found the first True
                true_found = True
    # found zero or one True value
    return true_found

我的输出:

$ python -mtimeit -s 'import test; l=[True]*100000' 'test.OP(l)' 
1000000 loops, best of 3: 0.523 usec per loop
$ python -mtimeit -s 'import test; l=[True]*100000' 'test.DavidRobinson(l)' 
1000 loops, best of 3: 516 usec per loop
$ python -mtimeit -s 'import test; l=[True]*100000' 'test.FJ(l)' 
100000 loops, best of 3: 2.31 usec per loop
$ python -mtimeit -s 'import test; l=[True]*100000' 'test.JonClements(l)' 
1000000 loops, best of 3: 0.446 usec per loop
$ python -mtimeit -s 'import test; l=[True]*100000' 'test.moooeeeep(l)' 
1000000 loops, best of 3: 0.449 usec per loop

可以看出,OP解决方案明显优于此处发布的大多数其他解决方案。不出所料,最好的是那些具有短路性能的产品,尤其是乔恩·克莱门茨(Jon
Clements)发布的解决方案。至少对于True一长串中的两个早期值而言。

这里完全没有任何True价值:

$ python -mtimeit -s 'import test; l=[False]*100000' 'test.OP(l)' 
100 loops, best of 3: 4.26 msec per loop
$ python -mtimeit -s 'import test; l=[False]*100000' 'test.DavidRobinson(l)' 
100 loops, best of 3: 2.09 msec per loop
$ python -mtimeit -s 'import test; l=[False]*100000' 'test.FJ(l)' 
1000 loops, best of 3: 725 usec per loop
$ python -mtimeit -s 'import test; l=[False]*100000' 'test.JonClements(l)' 
1000 loops, best of 3: 617 usec per loop
$ python -mtimeit -s 'import test; l=[False]*100000' 'test.moooeeeep(l)' 
100 loops, best of 3: 1.85 msec per loop

我没有检查统计显着性,但是有趣的是,这一次FJ建议的方法,尤其是Jon Clements提出的方法似乎明显更好。



 类似资料:
  • 问题内容: 我有两个清单说 现在,我想找出List2中是否存在List1的所有元素。在这种情况下,就全部存在。我不能使用子集函数,因为我可以在列表中重复元素。我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中的出现次数。有一个更好的方法吗? 谢谢。 问题答案: 当出现次数无关紧要时,您仍可以通过动态创建集合来使用子集功能: 如果需要检查每个元素在第二个列表

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 我有2张表:角色 在用户中,我role_id,我想检查该角色是否在true上有一列“access_admin_area”。如果为真,我正在使用中间件。 从用户模型: SQLSTATE[42703]:未定义的列:7错误:列角色。用户id不存在↵第1行:从“角色”中选择*,其中“角色”。“用户id”=$1和“角色..”。。

  • Json响应: 是否有任何方法可以使用hamcrest matcher的放心断言断言“id”除了“myId”之外没有任何其他值? 其他示例断言:response。然后()。assertThat()。主体(“结果”,hasSize(大于(0)); 目前,我正在通过从响应创建一个集合,并使用testNG断言断言它的大小为1,但我希望通过restAssured断言和hamcrest matcher实现同

  • 问题内容: 这是django模板的一部分,它应该做的是打印出几个单选按钮,对应于分配给按钮的答案。但是我不知道为什么我可以检查多个单选按钮,这让我很困惑。它应该只允许我检查一个单选按钮,但是我以某种方式拥有它,但是我却丢失了它。有什么帮助吗?谢谢。 问题答案: 只需给他们起相同的名字:

  • 问题内容: 我在SQL Server 2008数据库中具有以下表: tblItem ,它具有一个 ItemID 字段; tblGoodItem ,它也有一个ItemID字段,并且有一个指向tblItem的外键; tblBadItem ,它也具有ItemID字段,并且还具有指向tblItem的外键。 一个项目不能同时是好项目和坏项目。它必须是一个或另一个。但是,无论该项目是好是坏,它都必须是一个项目