Python的all()/ any()之类的方法用于列表的一部分/一部分?

Khi*_*min 4 python loops for-in-loop

最优雅/ Python化的实现方式是:“如果列表中总值的x%大于y,则返回true”。我目前已经实现了一个功能:

def check(listItems, val):
   '''A method to check all elements of a list against a given value.
   Returns true if all items of list are greater than value.'''
   return all(x>val for x in listItems)
Run Code Online (Sandbox Code Playgroud)

但是对于我的用例来说,等待这种特殊条件是非常昂贵的,而且没有用。如果列表中〜80%的项目大于给定值,我想继续。我想到的一种方法是按降序对列表进行排序,创建另一个列表,然后将列表元素的80%复制到新列表中,然后为该新列表运行函数。但是,我希望必须有一种更优雅的方法。有什么建议么?

Mar*_*yer 7

听起来您正在处理很长的清单,这就是为什么这样做很昂贵。如果可以,请您在条件满足后尽快退出,如果这样很好。any()可以做到这一点,但您最好避免在将整个列表传递给之前先阅读整个列表any()。一种选择是使用itertools.accumulate来保持连续的True值总计并将其传递给任何值。就像是:

from itertools import accumulate

a = [1, 2, 2, 3, 4, 2, 4, 1, 1, 1]

# true if 50% are greater than 1
goal = .5 * len(a) # at least 5 out of 10   
any( x > goal for x in accumulate(n > 1 for n in a))
Run Code Online (Sandbox Code Playgroud)

accumulate无需阅读整个列表-它将开始传递到目前为止所看到的True值的数量。any一旦找到一个真值,它就应该短路,在上述情况下,它是在索引5处。