开发者社区> 问答> 正文

排序列表的过滤

我有一个列表,其中元素已经排序。我想过滤掉大于给定数字的元素。

例如,

original_list = [2,3,5,7,11]
limit = 6
expected_list = [2,3,5] # All elements <=6 

最有效的方法是什么?

我看到的所有现有问题都涉及未排序的列表。我相信如果列表已经排序,将会有一种更有效的过滤方法。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 12:26:35 393 0
1 条回答
写回答
取消 提交回答
  • 这是2种方法:

    from bisect import bisect_right
    
    # using a while loop
    def gen(l, m):
        i = 0
        while i < len(l) and l[i] <= m:
            yield l[i]
            i += 1
    
    original_list = [2,3,5,7,11]
    limit = 6
    
    print(list(gen(original_list, limit)))
    
    # using bisect_right
    limit = bisect_right(original_list, limit)
    print(original_list[:limit])
    

    输出:

    [2, 3, 5]
    [2, 3, 5]
    

    由于时间复杂度为O(logN),因此整体bisect的性能要好得多,使用while循环版本会给您带来O(N)的时间复杂度,但是有时,如果您的limit值为,while循环版本会更有效。在列表的最下方

    回答来源:stackoverflow

    2020-03-24 12:26:44
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载