gpt4 book ai didi

python - 聪明的 any() 之类的函数来检查是否至少有 n 个元素为真?

转载 作者:太空狗 更新时间:2023-10-30 00:23:59 26 4
gpt4 key购买 nike

假设我有一个可迭代对象(在我的例子中是一个列表):

l = [True, False, False, True]

我知道检查这些元素中至少有一个是否为 True 的最简单和最快的方法就是使用 any(l),它将返回 True

但是如果我想检查至少两个元素为 True 怎么办?我的目标是以最快的方式处理它。

我的代码现在看起来像这样(对于两个元素):

def check_filter(l):
if len([i for i in filter(None, l)]) > 1:
return True
return False

这比 any() 慢了大约 10 倍,而且对我来说似乎不是很 pythonic。

最佳答案

您可以简单地在序列上使用迭代器并检查迭代器上的 any 是否在 n 次内始终返回 True:

def check(it, num):
it = iter(it)
return all(any(it) for _ in range(num))

>>> check([1, 1, 0], 2)
True

>>> check([1, 1, 0], 3)
False

这里的关键点是迭代器会记住它最后的位置,所以每个 any 调用都将从最后一个结束的位置开始。并将它包装在 all 中确保它在一个 anyFalse 时尽早退出。

至少在性能方面,这应该比大多数其他方法更快。但是以可读性为代价。


如果你想让它比基于 map 的解决方案更快,itertools.repeat 可以稍微快一点:

from itertools import repeat

def check_map(it, num):
return all(map(any, repeat(iter(it), num)))

以其他答案为基准:

# Second "True" element is in the last place
lst = [1] + [0]*1000 + [1]

%timeit check_map(lst, 2) # 10000 loops, best of 3: 20.3 µs per loop
%timeit check(lst, 2) # 10000 loops, best of 3: 23.5 µs per loop
%timeit many(lst, 2) # 10000 loops, best of 3: 153 µs per loop
%timeit sum(l) >= 2 # 100000 loops, best of 3: 19.6 µs per loop

# Second "True" element is the second item in the iterable
lst = [1, 1] + [0]*1000

%timeit check_map(lst, 2) # 100000 loops, best of 3: 3.05 µs per loop
%timeit check(lst, 2) # 100000 loops, best of 3: 6.39 µs per loop
%timeit many(lst, 2) # 100000 loops, best of 3: 5.02 µs per loop
%timeit sum(lst) >= 2 # 10000 loops, best of 3: 19.5 µs per loop

关于python - 聪明的 any() 之类的函数来检查是否至少有 n 个元素为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com