差找:
线性查找:
num_list = [0,1,2,3,4,5,6]
def linear_search(Num_List, value):
for key, elem in enumerate(Num_list):
if elem == value:
return key
return -1
assert linear_search(4,num_list) == 5
#print(list(enumerate(num_list, start=1)))
#[(1, 0), (2, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6)]
enumerate函数:用于将一个可遍历的数据列表(如列表,元组,或字符串)组合为一个索引序列,同时列出数据和数据下标。
语法:
enumerate(iteration , start= 0)
参数:
iteratioin :一个序列,迭代器或其他支持迭代的对象。
start --下标起始位置。
返回值:
返回以个枚举对象
在python里面 一切皆对象,所以我们可以把函数当成一个参数传给另一个函数。
num_list = [0,1,2,3,4,5,6]
def linear_search(Num_List, operate):
for key, elem in enumerate(Num_List):
if operate(elem):
return key
return -1
assert linear_search(num_list,lambda x:x>=5) == 5
#该式子就会返回序列中第一个大于等于5的数字
#同样的也可返回第一个小于5的数
二分查找
前提条件:序列是有序的(单调增或则单调减)
def binary_search(num_list,value)
left = 0
right = len(num_list)-1
while left<=right:
mid = (left+right)//2
if num_list[mid]<value:
left = mid+1
elif num_list[mid]>value:
right = mid-1
else
return mid
return -1
用递归实现二分查找
numlist= [******]
def binary_search(left,right,value):
if left>right:
return -1
mid = (left+right)//2
if num[mid]<value:
binary_search(mid+1,right,value)
elif num[mid]<value:
binary_search(left,mid-1,value)
else:
return mid
二分查找变形题目:
要求:一个有序数组中插入一个值之后,数组仍要保持有序,请你找出这个位置。
list_num=[**]
def binary_search(value):
left = 0
right = len(list_num)
while left <= right:
mid =(left+right)//2
if value > list_num[mid]:
left = mid+1
elif value < list_num[mid]:
right = mid-1
else:#相等的情况下插入该节点即可
list_num.insert(mid,value)
return
#若不相等就插入mid的下一位。
mid2 = (left+right)//2
list_num(mid2+1,value)
bisect模块
bisect_left
目的在于查找该数值并返回插入的位置并返回,数值相等会返回该值的下标值,也就相当于是插入位置。
import bisect
list_num=[]
list_num.sort()
pos = bisect.bisect_left(list_num,value)
#value:要插入的值
insort==insort_right
在列表中插入元素x,并在排序后保持排序。如果x已经在a中,则插入x的右边。
使用方法:
import bisect
list_ = [1,2,3,4,5,..]
li.sort()
biset.insort(list_,3)
insort_left()
在列表list中插入元素x,如果x已经在a中,把他插入右x的左边。
实用方法同上。
itertools
python内建模块itertools提供了非常有用的用于操作迭代对象的函数
首先,我们看看itertools提供几个“无限迭代器”:
count函数会创建一个无限迭代器,
import itertools
iters = itertools.count(1)
for n int iters:
print(n)
#从1开始逐渐递增输出
#1.2.3.4....
repeat(value,num)
第一个参数表示要迭代的值,第二个值迭代的次数:
iters = itertools.repeat('T',5)
for n in iters:
print (n)
#T T T T T
只有用for循环的情况下值才会一个一个的产生,因为迭代器会在你每次调用过后才会改变。
chain函数
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器:
for x in itertools.chain('123','456'):
print(c,end='')
#1 2 3 4 5 6