我試圖找到列表的一部分內的最小元素。在下面的例子中,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