查找(线性,二分)

差找:

线性查找:

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值