【问题标题】:Algorithm (Python): find the smallest number greater than k算法(Python):找到大于 k 的最小数
【发布时间】:2011-12-27 10:42:07
【问题描述】:

我从算法的角度有一个问题。 我有一个数字列表(浮点数)

1.22,3.2, 4.9,12.3.....and so on

我想找到大于(比如说)4.. 所以答案是 4.9 但除了明显的解决方案..(遍历列表并跟踪大于 k 的最小数字)什么是“pythonic 方式”来做到这一点。 谢谢

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

    这是filter 的完美场景。

    >>> L = [1.22, 3.2, 4.9, 12.3]
    >>> k = 4
    >>> a = min(filter(lambda x: x > k, L))
    >>> print(a)
    4.9
    

    你也可以使用列表推导:

    >>> L = [1.22, 3.2, 4.9, 12.3]
    >>> k = 4
    >>> a = min([element for element in L if element > k])
    >>> print(a)
    4.9
    

    虽然列表推导在第一个视图上似乎不那么直接,但这是推荐的方式。根据一些 Python 开发人员的说法,不应该使用 filter

    generator expression 更好,因为它不会在内存中创建列表:

    >>> L = [1.22, 3.2, 4.9, 12.3]
    >>> k = 4
    >>> a = min(element for element in L if element > k)
    >>> print(a)
    4.9
    

    【讨论】:

    • 警告:如果可迭代对象为空,min() 将抛出 ValueError(对于过滤器函数返回值和列表理解。要处理此问题,请添加 if/else 以检查可迭代对象是否为如果是,则不要清空并处理它。
    【解决方案2】:

    二进制搜索将是处理此问题的标准方法,但前提是列表已排序,如先前的答案所指出的那样。

    Python binary search-like function to find first number in sorted list greater than a specific value

    In Python, how do you find the index of the first value greater than a threshold in a sorted list?

    讨论为您执行此操作的模块:http://docs.python.org/library/bisect.html

    【讨论】:

      【解决方案3】:

      我对python一无所知,但从算法的角度来看,也许我可以添加一些东西。在您的示例中,您的列表单调递增(排序)。如果您的列表始终如此,那么一个小的优化可能是在您达到大于 4 的数字时停止迭代。

      如果你的列表总是有几个小于 4 的数字,这将是一个很好的优化,但如果目标数字前后的项目数是随机的,那么这种改进并不可靠。

      在这种情况下,您可能希望通过分区来搜索列表。测试中间元素是否大于4,如果大于则丢弃上半部分,否则丢弃下半部分。在新的半长列表上做同样的事情。您需要处理偶数和奇数以及列表段中只剩下 1 或 2 个项目的情况。对于大型列表,这应该会显着减少测试次数。

      【讨论】:

        【解决方案4】:
        min(x for x in my_list if x > 4)
        

        【讨论】:

        • 当然,这正是您在 OP 中所说的(“遍历列表,跟踪大于 k 的最小数字”)——这只是一种紧凑的编写方式。
        • @Amber:嗯,你还应该做什么? :)
        • @SvenMarnach - 我并不是说你的回答有什么问题(实际上没有比你能做的更好的了);只是向提问者指出这只是语法糖,而不是比迭代更有效的东西。
        • 我也有同样的问题。阅读接受的答案让我有点沮丧 - 谁想去其他地方挖掘 - 然后我看到了这个。不管有没有语法糖,它仍然很甜。
        猜你喜欢
        • 2014-04-29
        • 2011-10-08
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 2013-01-17
        相关资源
        最近更新 更多