假设我们有一个排序列表:
lst = [1,3,4,89,456,543] # a long one
Run Code Online (Sandbox Code Playgroud)
我们想要做的是找到列表中小于的元素数量mx.
简单:
n = len([x for x in lst if x < mx])
Run Code Online (Sandbox Code Playgroud)
或与发电机:
n = sum(1 for x in lst if x < mx)
Run Code Online (Sandbox Code Playgroud)
我假设第二种方法应该稍快一点,但是,这里的问题是我们在早期停止时会查看列表的所有元素.它不使用列表已排序的事实.
是的,我可以用循环来做到这一点:
s = 0
for x in lst:
if x >= mx:
break
s += 1
Run Code Online (Sandbox Code Playgroud)
但是,我觉得必须有一个更好(更短和/或更快)的方法来做同样的事情,可能有一些发电机或外部模块功能?
我们可以通过二进制搜索做得更好,这可以在bisect模块中轻松实现:
import bisect
n = bisect.bisect_left(lst, mx)
Run Code Online (Sandbox Code Playgroud)
这需要时间长度为对数lst,而早期终止的线性搜索是线性的n.这通常会更快.
如果要使用线性搜索,takewhile函数from itertools可以提前停止迭代:
import itertools
n = sum(1 for _ in itertools.takewhile(lambda x: x < mx, lst))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
716 次 |
| 最近记录: |