2014-10-10 49 views
3

我试图找到列表的一部分内的最小元素。在下面的例子中,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]包括?

+0

不幸的是,这并不是Python如何使用列表切片。如果你想'b'索引是包容性的,只需在其中添加'1' ... – MattDMo 2014-10-10 01:10:36

+0

另外,不要在'list','dict','str'等内置插件中为你的变量命名。 – MattDMo 2014-10-10 01:11:27

回答

2

默认情况下,没有。

对于这种情况,它是更传统的事:

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)额外空间。