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

标签 python loops for-in-loop

什么是最优雅/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/

相关文章:

python - 如何防止plotly自动出图

python - 导入错误: No module named numpy on Ubuntu after Numpy Installation

jquery - 如何在 jQuery 中连续交替显示 2 个元素?

javascript - javascript 中 for 与 for var 的区别

Python 序列化(到 JSON)问题

python - 如何检查输出是否包含特定单词?

python - 我对 Python 的 for in 循环有一个复杂的问题

ios - 通过快速枚举从 PLIST 获取数据

javascript - 如何在 php 循环中使用 jquery 更改 css

c - c中不进入循环的问题