python的排序和查询
#encoding=utf-8 __author__ = ‘[email protected]‘ ################# python自带的排序接口 ##################### # python内带非常强大的排序函数,sorted,或sort # sorted是内建函数,sort是列表类的函数,它们都用法都是一样的,下面以sorted为例子 # 利用python的sorted函数进行排序,这个函数可以输入三个参数,key参数用于声明根据数据的哪一个部分进行排序,reversed参数 # 声明正序还是反序,cmp可以定义排序的规则 def sort_sorted_v1(sort_list): ‘‘‘ 利用data里面每一项的下划线分割后最后一项进行反序排序 @data list 需要排序的数据 这个函数如果输入 data=[‘ljxz_sa_100‘,‘ljxz_sa_78‘,‘ljxz_sa_910‘,‘ljxz_sa_90‘] 会返回 [‘ljxz_sa_910‘, ‘ljxz_sa_100‘, ‘ljxz_sa_90‘, ‘ljxz_sa_78‘] ‘‘‘ return sorted(sort_list, key=lambda x: int(x.split(‘_‘)[-1]), reverse=True) def sort_sorted_v2(sort_list): ‘‘‘ 通过定义cmp参数,自定义排序的规则为按照数据的长度来排序 @data list 需要排序的数据 这个函数如果输入 data=[1, 8, ‘fefe‘, 678, 35, 4] 会返回 [1, 8, 4, 35, 678, ‘fefe‘] ‘‘‘ def my_cmp(x, y): f = lambda x: len(str(x)) return cmp(f(x), f(y)) return sorted(sort_list, cmp=lambda x, y: my_cmp(x, y)) ################# 常规的排序方法 ##################### #1. 插入排序 def insertion_sorting(sort_list): sort_list_len = len(sort_list) if sort_list_len > 1: #从列表的第二个数开始遍历列表 for i in range(1, sort_list_len): j = i - 1 tmp_item = sort_list[i] #从i的位置开始,向左遍历列表,一旦有数比i对于的数大,就让这个大的数向后移动 while j >= 0 and sort_list[j] > tmp_item: sort_list[j + 1] = sort_list[j] j -= 1 #如果有数移动了,就在j+1的位置放入i对应的数 if j != i - 1: sort_list[j + 1] = tmp_item return sort_list #2. 冒泡排序 def bubble_sorting(sort_list): ‘‘‘ 通过比较相邻两个数的大小,大的移动到右边的方法,将左边i个数的最大的数移动到最右边,然后再将左边i-1个数的最大 的数移动到最右边,依次类推。i开始为列表的长度 ‘‘‘ sort_list_len = len(sort_list) if sort_list_len > 1: for i in range(sort_list_len - 1): for j in range(sort_list_len - 1 - i): if sort_list[j] > sort_list[j + 1]: sort_list[j], sort_list[j + 1] = sort_list[j + 1], sort_list[j] return sort_list #2. 冒泡排序 def bubble_sorting1(sort_list): ‘‘‘ 通过比较相邻两个数的大小,大的移动到右边的方法,将左边i个数的最大的数移动到最右边,然后再将左边i-1个数的最大 的数移动到最右边,依次类推。i开始为列表的长度 ‘‘‘ sort_list_len = len(sort_list) if sort_list_len > 1: i = sort_list_len while i > 1: for j in range(i - 1): if sort_list[j] > sort_list[j + 1]: sort_list[j], sort_list[j + 1] = sort_list[j + 1], sort_list[j] i -= 1 return sort_list #3. 选择排序 def selection_sorting(sort_list): ‘‘‘ ‘‘‘ sort_list_len = len(sort_list) if sort_list_len > 1: for i in range(sort_list_len - 1): min_ = i #找到i后面(包括i)的所有数的最小值,跟i交换 for j in range(i, sort_list_len): if sort_list[min_] > sort_list[j]: min_ = j if min_ != i: sort_list[min_], sort_list[i] = sort_list[i], sort_list[min_] return sort_list #快速排序 def quick_sorting(sort_list): ‘‘‘ 1.输入i和j,k等于下标为i的值,i为列表的开始下标,j为结束下标 2.j依次减一,直到有sort_list[j]<k,就令sort_list[i] = sort_list[j] 3.i依次加一,直到有sort_list[i]>k,就令sort_list[j] = sort_list[i] 4.重复2,3,直到i和j相等,令sort_list[i]=k,这样k的位置就排好了,因为左边的都是比它小的,右边的都是比它大的 5.把k左边的数和右边的数看成两个新的列表,对他们分别执行1,2,3,4,5步的操作,直到新的列表的长度都等于1 ‘‘‘ def _quick_sorting(i, j): if not j > i: return i_, j_ = i, j k = sort_list[i] while i != j: while i != j: if sort_list[j] < k: sort_list[i] = sort_list[j] break j -= 1 while i != j: if sort_list[i] > k: sort_list[j] = sort_list[i] break i += 1 sort_list[i] = k _quick_sorting(i_, i - 1) _quick_sorting(i + 1, j_) _quick_sorting(0, len(sort_list) - 1) return sort_list if __name__ == ‘__main__‘: sort_list = [‘ljx_sa_100‘, ‘ljx_sa_78‘, ‘ljx_sa_910‘, ‘ljx_sa_90‘] print sort_sorted_v1(sort_list) sort_list = [1, 8, ‘fefe‘, 678, 35, 4] print sort_sorted_v2(sort_list) sort_list = [1, 8, 48, 678, 35, 4] print insertion_sorting(sort_list) sort_list = [1, 8, 48, 678, 35, 4] print bubble_sorting(sort_list) sort_list = [1, 8, 48, 678, 35, 4] print selection_sorting(sort_list) sort_list = [1, 8, 48, 678, 35, 4] print quick_sorting(sort_list)
#encoding=utf-8 __author__ = ‘Administrator‘ #############python内建查找函数################## #1.index 这是python列表类自带的查找函数 def search_index(src, target): ‘‘‘ @param src:list 查找的列表 @param target: 查找的目标 @return: 查找目标的下标 ‘‘‘ try: return src.index(target) except ValueError: return -1 #2.find 用于查找字符串的函数 def search_find(src, target): ‘‘‘ @param src:str 查找的字符串 @param target: 查找的目标 @return: 查找目标的下标,如果查询不到,就返回-1 ‘‘‘ src.find(target) #3.re python里面的正则模块,功能十分强大,实际开发中多用这种方法 def search_re(src, patt): ‘‘‘ @param src:str 查找的字符串 @param target: 正则表达式 @return: 所有符合正则的结果的列表 ‘‘‘ import re return re.findall(patt, src) ################一般的查询算法#################### #1.顺序查询 def search_sequence(src, target): ‘‘‘ @param src:list 查找的源列表 @param target: 查找目标 @return: 查找目标的下标,如果查询不到,就返回-1 ‘‘‘ for index, value in enumerate(src): if target == value: return index return -1 #2.二分法查询 def search_dichotomy(src, target): ‘‘‘ @param src:list 查找的源列表,该列表需要排序好,而且是升序 @param target: 查找目标 @return: 查找目标的下标,如果查询不到,就返回-1 ‘‘‘ low = 0 hight = len(src) while hight > low: mid = (low + hight) / 2 if src[mid] == target: return target elif src[mid] < target: low = mid else: hight = mid return -1 if __name__ == ‘__main__‘: src = [1, 2, 3, 7, 9, 54, 666] print search_index(src, 554) src = ‘123486875‘ print search_index(src, ‘48‘) src = ‘123486875‘ print search_re(src, ‘48‘) src = [1, 2, 3, 7, 9, 54, 666] print search_sequence(src, 9) print search_dichotomy(src, 0)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。