【问题标题】:Filter a sorted list [duplicate]过滤排序列表[重复]
【发布时间】:2020-03-17 07:59:25
【问题描述】:

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

例如,

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

实现这一目标的最有效方法是什么?

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

【问题讨论】:

  • 5 在中间元素上,你可以定义中间元素mid = len(original_list)\\2 然后像x = original_list[:mid]
  • @M3duZa 但如果不是呢?如果limit8 怎么办?
  • @M3duZa 列表已经排序,不需要每次都遍历到最后一个元素。

标签: python python-3.x sorting filter


【解决方案1】:
import bisect

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

index = bisect.bisect(original_list, limit)
filtered = original_list[:index]
assert filtered == expected_list

【讨论】:

    【解决方案2】:

    如果您的列表按升序排序并且您希望值低于某个阈值,您可以使用itertools.takewhile 以下方式:

    import itertools
    original_list = [2,3,5,7,11]
    limit = 6
    expected_list = list(itertools.takewhile(lambda x:x<=limit, original_list))
    print(expected_list)  # [2, 3, 5]
    

    【讨论】:

      【解决方案3】:

      这里有两种方法:

      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) 时间复杂度,但有时while 循环版本可以更有效,如果你的@ 987654326@ 在您列表的最下方

      【讨论】:

      • 怎么来的?当您计算大 O 时,您会考虑最坏的情况
      • 好吧,如果你想要这个级别的细节,但通常你不会这样做,但是对于 while 循环是 O(N),因为最坏的情况是 limit = N跨度>
      • 二分法是二分查找所以是 O(logN) ,你可以看这里stackoverflow.com/questions/12022249/…
      • 我同意这一点,但它不包括在 while 循环解决方案中
      【解决方案4】:

      我们可以在这里使用列表推导吗,

      expected_list = [value for value in original_list if value < limit]
      

      【讨论】:

      • OP 要求最有效的排序数组方法。由于您的解决方案将遍历列表中的所有值,因此此解决方案不是这里的方法。
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2014-02-25
      • 2017-04-25
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      相关资源
      最近更新 更多