2014-10-10 46 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)額外空間。