记得我写第一篇关于冒泡序列的博客时,我就在想,冒泡排序可以正序和倒序,唯一的区别就是将符号换一下。那我如果要两种排序方式都用的话,一样的代码岂不是要写两遍?????不是吧,太麻烦了。 ̄へ ̄ ̄へ ̄
于是乎,哈哈哈哈,参数就出现了
1.设置一个参数,给定一个默认值,True的时候是正序;False的时候是倒序。
def mm(a,reverse=True):
if reverse:#如果reverse为True,升序
for i in range(len(a)):
for j in range(len(a)-1-i):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
else:
for i in range(len(a)):
for j in range(len(a)-1-i):
if a[j]<a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
a=[1,2,4,3,1,6,4,8,4]
print('排序前',a)
mm(a,reverse=False)
print('排序后',a)
其实就是把正序和倒序的代码写在一起,加一个if,else判断,根据reverse的值进行正序或者倒序
2.对不同的数据类型进行排序,给定一个key参数,默认值为None,最后在调用的时候传入的是一个函数。
def list_sort(lt, key=None, reverse=True):
n = len(lt)#列表的长度,列表的数据类型不限,决定了循环的次数
for i in range(n-1):#最外层循环次数
for j in range(n-i-1):#内层循环次数
if key:#如果数据类型为空
if reverse:#设置为升序
if key(lt[j]) > key(lt[j + 1]):
lt[j], lt[j + 1] = lt[j + 1], lt[j]
else:#设置为降序
if key(lt[j]) < key(lt[j + 1]):
lt[j], lt[j + 1] = lt[j + 1], lt[j]
else:#如果数据类型不为空的话
if reverse:#设置升序
if lt[j] >lt[j+1]:
lt[j], lt[j+1] = lt[j+1], lt[j]
else:#设置降序
if lt[j] <lt[j + 1]:
lt[j], lt[j + 1] = lt[j + 1], lt[j]
return lt #返回列表
lt = [
{'name': 'xiaoming', 'age': 18},
{'name': 'xiaoming', 'age': 15},
{'name': 'xiaoming', 'age': 16},
{'name': 'xiaoming', 'age': 17}
]
print(list_sort(lt, key=lambda d: d['age'], reverse=False))#调用函数,key传入一个lambda匿名函数,在这里的主要目的是为了获取lt列表中的数字项,即年龄。
打印结果:
注意看,结果是根据年龄的大小来进行排序的。
其实这个代码的逻辑性有点小强,只要你掌握了核心思想,其实还是蛮简单的。(/≧▽≦)/(/≧▽≦)/