算法(Python):找到大于k的最小数

时间:2011-11-12 00:43:35

标签: python algorithm

我从算法的角度来看有一个问题。 我有一个数字列表(花车)

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

我想找到最小的数字(比如说)4 .. 所以答案是4.9 但除了明显的解决方案..(迭代通过列表并保持最小数量大于k的轨道)这样做的“pythonic方式”是什么。 感谢

4 个答案:

答案 0 :(得分:16)

min(x for x in my_list if x > 4)

答案 1 :(得分:8)

二进制搜索将是一种处理此问题的标准方法,但前提是该列表已按照先前的答案指出进行排序。

请参阅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

答案 2 :(得分:5)

这是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

答案 3 :(得分:2)

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

如果您的列表总是少于4的数字,这将是一个很好的优化,但如果目标数量之前和之后的项目数是随机的,那么这种改进是不可靠的。

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