我试图找到列表的一部分内的最小元素。在下面的例子中,a是开始,b是结束。我想这些索引到包含地划分列表,因此,如果该列表是[1,2,3,9,4,10]索引1至4将包括2和4列表的包含范围Python
def minimum (a,b,list):
return min(list[a:b])
在其它单词,有没有办法使list[a:b]
包括?
我试图找到列表的一部分内的最小元素。在下面的例子中,a是开始,b是结束。我想这些索引到包含地划分列表,因此,如果该列表是[1,2,3,9,4,10]索引1至4将包括2和4列表的包含范围Python
def minimum (a,b,list):
return min(list[a:b])
在其它单词,有没有办法使list[a:b]
包括?
默认情况下,没有。
对于这种情况,它是更传统的事:
min(li[a:b + 1])
另外注意命名您的变量列表中,因为它可以产生意想不到的后果(沉默命名空间的问题),为“列表”又名建在列表容器类型。
如果您只是想编写自己的最小方法,可以使用上述方法将此行为封装在最小方法中,这样您就不必再次考虑它了。
备注:标准列表分片使用O(N)空间,如果最小值被称为反复增益,则对于大型列表可能会变得昂贵。一个便宜的O(1)空间替代办法是:
def minimum(a, b, li):
min(itertools.islice(li, a, b + 1))
编辑: 除非你是切片开始在列表的开头或有严格的内存限制,不要使用islice。它首先迭代到a,而不是直接索引到a,这可能会花费O(b)运行时间。
一个更好的解决办法是这样的,它与O(BA)运行的运行时间和O(1)空间:
def minimum(li, a=0, b=None):
if b is None:
b = len(li) - 1
if b - a < 0:
raise ValueError("minimum() arg is an empty sequence")
current_min = li[a]
for index in xrange(a, b + 1):
current_min = min(current_min, li[index])
return current_min
票友的解决方案,你可以使用,如果该列表是静态的(在查询序列中不删除和插入元素)将执行使用分段树的范围最小查询:http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/
构建树需要O(N)运行时和O(N)空间,尽管所有查询之后只需要O(log(N))运行时间和O(1)额外空间。
不幸的是,这并不是Python如何使用列表切片。如果你想'b'索引是包容性的,只需在其中添加'1' ... – MattDMo 2014-10-10 01:10:36
另外,不要在'list','dict','str'等内置插件中为你的变量命名。 – MattDMo 2014-10-10 01:11:27