什么是最优雅/pythonic 的实现方式:“如果列表中总值的 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)
但对于我的用例,等待这个特定条件的成本很高,而且有点无用。如果列表中约 80% 的项目大于给定值,我想继续。 我想到的一种方法是按降序对列表进行排序,创建另一个列表并将列表的 80% 的元素复制到新列表,然后为该新列表运行该函数。但是,我希望必须有一种更优雅的方式来做到这一点。有什么建议吗?
最佳答案
听起来您正在处理长列表,这就是成本高昂的原因。如果您能在满足条件后尽快退出,那就太好了。 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))
accumulate
不需要读取整个列表 — 它只会开始传递到该点为止看到的 True 值的数量。 any
应在找到真值后立即短路,在上述情况下,真值位于索引 5 处。
关于Python all()/any() 类方法用于列表的一部分/一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56956462/