排序函数介绍:sort()和sorted()都属于Python list的排序方法
区别:sort()属于永久性排列,直接改变该list; sorted属于暂时性排列,会产生一个新的序列。
#sorted() >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] #sort() >>> L = [5, 2, 3, 1, 4] >>> L.sort() >>> print L [1, 2, 3, 4, 5]
#sort后会返回None def paixu(list): return list.sort() paixu(['a','f','g','b','a']) #并没输出结果,返回None #sorted后会返回列表 def paixu(list): return sorted(list) paixu(['a','f','g','b','a']) #输出结果 ['a', 'a', 'b', 'f', 'g']
以下对常用的sorted进行介绍:
python 内置的sorted()函数可以对一个list进行排序:
>>> sorted([8,3,8,11,-2])
[-2, 3, 8, 8, 11]
既然说是高阶函数,那么它还可以接受一个key函数来实现自定义的排序,比如按照绝对值大小进行排序:
>>> sorted([8,3,8,11,-9],key=abs) [3, 8, 8, -9, 11]
key指定的函数将作用于list中的每一个元素上,根据key函数返回的结果进行排序。
来看看字符串排序的问题:
>>> sorted(['abc','Abc','Cba','bAc']) ['Abc', 'Cba', 'abc', 'bAc']
默认的,对于字符串,sorted函数按照ASCII的大小进行排序,因为C<a,大写的C会排在小写的a前面。
如果我们想要达到忽略大小写的排序,只需要更改一下key函数:
>>> sorted(['abc','Abc','Cba','bAc'],key=str.lower) ['abc', 'Abc', 'bAc', 'Cba']
结合lambda关键字按年龄排序:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] sorted(students, key=lambda s: s[2]) #按年龄排序 #输出结果 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
进一步,要进行反向排序,可以传入第三个参数reverse=True:
>>> sorted(['abc','Abc','Cba','bAc'],key=str.lower,reverse=True) ['Cba', 'bAc', 'abc', 'Abc']
sorted()排序的关键在于实现一个映射函数!
练习:
把一句话的每个单词按照开头的字母排序
思路:根据空格用split()把字符串变成list,然后用sort或者sorted排序
# change this value for a different result my_str = "Hello this Is an Example With cased letters" #第一种方法:这段长代码很难受 ''' a = my_str.upper() print(a) b = a.split(' ') print(b) b.sort() print(b) #your solution here ''' #第二种方法:结合key关键字一条就出来了 sorted(my_str.split(),key=str.lower) #输出结果 ['an', 'cased', 'Example', 'Hello', 'Is', 'letters', 'this', 'With'] #第三种,无视大小写排序 # breakdown the string into a list of words words = my_str.split() # sort the list words.sort() # display the sorted words print("The sorted words are:") for word in words: print(word, end=' ') #输出结果 The sorted words are: Example Hello Is With an cased letters this
用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)],
然后分别按名字和成绩排序
思路:定义两个函数用用t[0]和t[1]分别表示名字和成绩,然后用sort或sorted排序
#按名字字母排序 >>> L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] >>> def by_name(t): return t[0] #t[0]表示名字 >>> L2 = sorted(L,key = by_name) >>> print(L2) [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)] #按成绩低到高排序 >>> def by_score(t): return t[1] #t[1]表示成绩 >>> L2 = sorted(L,key = by_score) >>> print(L2) [('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]