針對有序的不重復數字的列表可以使用二分查找法
l =[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] print(l.index(66)) #查詢到66的索引 index = 0 #for循環的方式查找66的索引 for i in l: if i == 66: print(index) index += 1 for i in range(len(l)): #for循環方法二 if l[i] == 66: print(i)
利用遞歸函數,通過二分查找方法去尋找目標值的索引
list1=[1,2,4,5,11,67,7878,12228,158121] def get(num,list): if len(list) > 0: #判定列表長度是否為空,不為空繼續 mid=len(list)//2 #將列表的長度切半,並取出長度 if num > list[mid]: #對比列表中間值,如果目標大於中間值,取值范圍應該在列表二分后的左半部分 list=list[mid+1:] #為列表重新賦值為原列表的左半部分 elif num < list[mid]: #對比列表中間值,如果目標大於中間值,取值范圍應該在列表二分后的右半部分 list=list[:mid] #為列表重新賦值為原列表的右半部分 else: #對比列表的中間值,切好等於目標 print("find it") #大於find it,並且執行 return 結束函數 return get(num,list) #函數走到這里,如果沒有return說明,目標沒有找到,接下來調用自己后,變成了遞歸函數.繼續執行函數 else: print("not find") #如果列表長度為空,說明目標不在列表中,打印("not find),結束函數 return get(5,list1)
l1 = [2,3,5,10,15,16] def two_search(l,aim,start=0,end=None): end = len(l) - 1 if end is None else end #若end參數為默認值那么重新給end賦值為len(l)-1,否則end=end參數的值 if end >= start: #判斷end是否大於start,如果小於說明沒有該值 mid_index = (end - start) // 2 + start if aim > l[mid_index]: return two_search(l,aim,start=mid_index+1,end=end) elif aim < l[mid_index]: return two_search(l,aim,start=start,end=mid_index-1) elif aim == l[mid_index]: return mid_index else: return '沒有此值' else: return '沒有此值' print(two_search(l1,5))