都说加上ed就是过去时,如果可以,我想插上ed的翅膀,回到过去,看着那个曾经的自己,似曾相识,恍如隔日,如梦如幻,如泡如影,如露如电,如果不知道sort()和sorted()就往下看。
(1)使用范围不一样
只有当对象是列表时,才能调用sort()方法,而sorted()是全局函数,可作用于所有可迭代对象。
(2)返回结果不一样
因为sort()是列表的自带方法,所以当列表调用此方法时,会改变自身的值,且返回值为None。而sorted()不会改变原有对象的值,会返回一个新对象。
结合以上两点,来看具体例子:
# 列表可以调用sort()方法,并会改变自身的值,返回值为Nonea = [1, 5, 7, 3, 4]a.sort()print(a) # [1, 3, 4, 5, 7]b = a.sort()print(b) # None# 元组不支持sort()方法c = (1, 5, 7, 3, 4)c.sort()print(c) # AttributeError: 'tuple' object has no attribute 'sort'# sorted()函数可以作用于元组,并不改变原有元组的值,且返回排完序后的新列表c = (1, 5, 7, 3, 4)d = sorted(c)print(c) # (1, 5, 7, 3, 4)print(d) # [1, 3, 4, 5, 7]
所以当我们需要保留原有的列表时,那就应该使用sorted()函数,否则就用列表自身的sort()方法,因为sort()方法不需要复制原有的列表,会消耗较少内存。
(3)key参数的使用
sort()和sorted()都有一个key参数,且用法相同,该参数是一个函数,在每个元素被比较前调用,只接受一个值并返回一个用于比较的值。
以下是调用列表的sort()方法,key作用是根据每个元素的索引为2的值进行比较。
list_data = [('老王', '北京', 36), ('老李', '上海', 42), ('老张', '广州', 26)]list_data.sort(key=lambda x: x[2])print(list_data) # [('老张', '广州', 26), ('老王', '北京', 36), ('老李', '上海', 42)]
以下是使用sorted()对字典进行排序(根据value值大小)
dict_data = {'apple': 15, 'orange': 12, 'banana': 17}result = sorted(dict_data, key=lambda x: x[1])print(result) # ['banana', 'apple', 'orange']
可以看到这并不是我们想要的结果,其原因是没有加.items(),这样只是给字典中的key值排序,即对apple、orange、banana三者排序。
又因为参数key规定根据索引为1的值进行排序,也就是比较三个单词中的第二位字母,即p、r、a。
而在比较字母时,所比较的是字母对应的Ascii值,字母顺序越靠前,其值越小。因此结果为banana、apple、orange。
要想根据value值大小对字典排序,需要加上.items()
dict_data = {'apple': 15, 'orange': 12, 'banana': 17}result = sorted(dict_data.items(), key=lambda x: x[1])print(result) # [('orange', 12), ('apple', 15), ('banana', 17)]
加上.items()后,其实就是对('apple', 15)、(‘orange’, 12)、('banana', 17)这三个元素进行排序,然后通过参数key规定根据索引为1的值进行排序,也就是根据value值排序。
另外,不论是sort()还是sorted()都是默认升序排列,也就是reverse参数默认值为False,如果想降序排列,则需将reverse设置为True即可。
关注微信公众号“Python小镇”,发现更多干货知识!