【发布时间】:2011-12-27 10:42:07
【问题描述】:
我从算法的角度有一个问题。 我有一个数字列表(浮点数)
1.22,3.2, 4.9,12.3.....and so on
我想找到大于(比如说)4.. 所以答案是 4.9 但除了明显的解决方案..(遍历列表并跟踪大于 k 的最小数字)什么是“pythonic 方式”来做到这一点。 谢谢
【问题讨论】:
我从算法的角度有一个问题。 我有一个数字列表(浮点数)
1.22,3.2, 4.9,12.3.....and so on
我想找到大于(比如说)4.. 所以答案是 4.9 但除了明显的解决方案..(遍历列表并跟踪大于 k 的最小数字)什么是“pythonic 方式”来做到这一点。 谢谢
【问题讨论】:
这是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
【讨论】:
【讨论】:
我对python一无所知,但从算法的角度来看,也许我可以添加一些东西。在您的示例中,您的列表单调递增(排序)。如果您的列表始终如此,那么一个小的优化可能是在您达到大于 4 的数字时停止迭代。
如果你的列表总是有几个小于 4 的数字,这将是一个很好的优化,但如果目标数字前后的项目数是随机的,那么这种改进并不可靠。
在这种情况下,您可能希望通过分区来搜索列表。测试中间元素是否大于4,如果大于则丢弃上半部分,否则丢弃下半部分。在新的半长列表上做同样的事情。您需要处理偶数和奇数以及列表段中只剩下 1 或 2 个项目的情况。对于大型列表,这应该会显着减少测试次数。
【讨论】:
min(x for x in my_list if x > 4)
【讨论】: