基础排序:
使用Python内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。
sorted()方法:
简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序。
sorted()语法:
sorted(iterable, key=None, reverse=False) #注在python2中该函数还有个cmp参数,不过在3中取消了
参数:
iterable -- 可迭代对象。
cmp(了解):用于比较的函数,比较什么由key决定;
key -- 主要是用来进行比较的元素,只有一个参数。用列表元素的某个属性或函数作为关键字,有默认值,迭代集合中的一项(指定可迭代对象中的一个元素来进行排序。)
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值:
返回重新排序的列表。
参数说明:
(1) cmp参数(了解):cmp接受一个函数,拿整形举例,形式为:
def f(a,b):
return a-b
如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数(-1);a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数(1)就行了
(2) key参数:key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下
def f(a):
return len(a)
key接受的函数返回值,表示此元素的权值,sorted将按照权值大小进行排序
(3) reverse参数:接受False 或者True 表示是否逆序
简单排序:
例1:
list = [5, 2, 3, 1, 4]
new_list = sorted(list)
print(new_list,list)
#[1, 2, 3, 4, 5] [5, 2, 3, 1, 4]
例1_1:
list = [5, 2, 3, 1, 4]
new_list = sorted(list,reverse = True)
print(new_list,list)
#[5, 4, 3, 2, 1] [5, 2, 3, 1, 4]
关键字排序:
例2:
list = [('b',2),('a',1),('c',3),('d',4)]
new_list = sorted(list, key=lambda x:x[1],reverse=True) #序列为第一个参数的序列(x[1]表示按任意元素中索引为1的元素排序)
print(new_list)
#[('d', 4), ('c', 3), ('b', 2), ('a', 1)]
例3:
List = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f(x):
return len(x)
new_list = sorted(List,key = f) #按照元素长度排序
print(new_list)
#[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]
例4:
List = ['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt',
'Chr1-14.txt',
'Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']
def func(element):
return int(element.split('-')[1].split('.')[0])
#对元素进行连续两次切片操作(比较函数的参数表示列表中的任意元素)
new_list = sorted(List, key=func)
#new_list = sorted(List, key=lambda d : int(d.split('-')[-1].split('.')[0]))
print(new_list)
#['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt', 'Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']
注:
这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不将这个关键字转化为整型,结果是这样的:
sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])
['Chr1-1.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']
这相当于把这个关键字当做字符串了,很显然,在python中,'2' > '10'
你可以定制你想要的key, 如 key = lambda x : len(x) 按照序列的长度去排序。key= lambda x : (x[1], x[0]) 按二个元素,再第一个 等等。。。
例5:
from operator import itemgetter, attrgetter
students = [('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),]
new_student = sorted(students, key=lambda student : student[2]) # sort by age(索引为2的元素排序)
new_student_1 = sorted(students, key=itemgetter(2))#根据第二个域进行排序
new_student_2 = sorted(students, key=itemgetter(1,2)) # sorted by grade then by age(有相同值时,根据多个元素排序)
print(new_student)
print(new_student_1)
print(new_student_2)
"""
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
"""
对由字典排序
例6:
from operator import itemgetter, attrgetter
d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}
new_d = sorted(d.items(), key=itemgetter(1), reverse=True)
#d.items():使用items()先将字典转换为二元组的列表
print(new_d)
#[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]
注:返回的是由tuple组成的List,不再是字典。
对字符串进行排序
例7:
str = "This is a test string from Andrew"
split_str = str.split(" ")
print("原序列:",split_str)
new_str = sorted(split_str,key=lambda x:x[0])
new_str_1 = sorted(split_str,key=lambda x: x.lower())
print("区分大小写的排序:",new_str)
print("不区分大小写的排序:",new_str_1)
"""
原序列: ['This', 'is', 'a', 'test', 'string', 'from', 'Andrew']
区分大小写的排序: ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
不区分大小写的排序: ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
"""
sort()函数
描述
sort()函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。语法
sort()方法语法:
list.sort(cmp=None, key=None, reverse=False)
参数
cmp(了解) -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
返回值
该方法没有返回值,但是会对列表的对象进行排序。
例8:
aList = ['Google', 'Runoob', 'Taobao', 'Facebook']
aList.sort()
print("List : ", aList)
#List : ['Facebook', 'Google', 'Runoob', 'Taobao']
例9:
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
random_1 = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort( key= takeSecond)
random_1.sort(key=lambda x:x[0])
# 输出类别
print('排序列表:', random)
print('排序列表:', random_1)
"""
排序列表: [(4, 1), (2, 2), (1, 3), (3, 4)]
排序列表: [(1, 3), (2, 2), (3, 4), (4, 1)]
"""
注:
sort 与 sorted 区别:
1、sort ()是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
2、list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
备注:
在python2.4前,sorted()和list.sort()函数没有提供key参数,但是提供了cmp参数来让用户指定比较函数。此方法在其他语言中也普遍存在。
在python3.0中,cmp参数被彻底的移除了,从而简化和统一语言,减少了高级比较和__cmp__方法的冲突。
在python2.x中cmp参数指定的函数用来进行元素间的比较。此函数需要2个参数,然后返回负数表示小于,0表示等于,正数表示大于。例如:
>>> def numeric_compare(x, y):
return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]
当我们将现有的2.x的代码移植到3.x时,需要将cmp函数转化为key函数:使用functools模块中的cmp_to_key()函数例10:
from functools import cmp_to_key
list = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f2(a,b):
return a[1]-b[1]
new_list = sorted(list,key = cmp_to_key(f2))
#按照每个字典元素里面key为1的元素的值排序
print(new_list)
#[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]