簡體   English   中英

聰明any()之類的函數檢查至少n個元素是否為True?

[英]clever any() like function to check if at least n elements are True?

假設我有一個iterable(在我的例子中是一個列表):

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迭代器總是返回True為n

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
L = [True, False, False, True]

這只做了所需的迭代:

def many(iterable, n):
    if n < 1:
        return True
    counter = 0
    for x in iterable:
        if x:
            counter += 1
            if counter == n:
                return True
    return False

現在:

>>> many(L, 2)
True

使用sum

sum(l) >= 2
# True

據推測, any經過迭代都會發現一個元素為True ,然后停止。

您的解決方案掃描所有元素以查看是否至少有2個。相反,它應該在找到第二個True元素后立即停止掃描。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM