在py中,排序经常用到的两个函数,一个是sort(), 一个是sorted(). 两者的使用是有一些差别的。
1. sort()排序只对列表排序,且会改变原列表的元素顺序,因为不会创建新的列表,所以效率较高。
2. sorted()是在sort()基础上又延申的排序函数,对可迭代对象都可以排序,即对列表、字符串、元组、字典等均可排序。但它不会改变原列表,它会创建新的列表,用来保存排序后的列表。所以,使用它比较稳妥,不会改变原数据。
sorted()函数对所有可迭代对象的排序返回的都是列表,如果想返回其他类型,可使用相应的函数去转换。
用法:
1. sort(key, reverse)参数key是规定排序规则,reverse参数默认是False升序,如果是True则为降序
1. 按照字符串长度进行排序
list1 = ['apple', 'banana', 'pitaya', 'pear', 'kiwi']
list1.sort(key=len)
print(list1)
输出结果是:
['pear', 'kiwi', 'apple', 'banana', 'pitaya']
对于元素全是字符串的列表,可以使用长度对列表进行排序,但如果遇到int这样没有len()函数的元素,就会报错TypeError: object of type ‘int’ has no len()。
2. 按照字符串的第二个字符进行排序
list1 = ['happy','sad', 'morose', 'excited', 'alert']
list1.sort(key=lambda x:x[1],reverse=True)
print(list1)
输出结果是:
['excited', 'morose', 'alert', 'happy', 'sad']
对于全是字符串的列表,可以对其元素第二个字符进行排序,但如果某个元素只有1个字符,却按照第2个字符排序,就会报错IndexError: string index out of range
3. 找到第n大的值
list1 = [4, 3, 9, 6, 1]
list1.sort(reverse=True)
print('max:', list1[0])
print('2nd max:', list1[1])
输出结果是:
max: 9
2nd max: 6
先降序,再按照索引取值,找到第一大和第二大的值。
4. 切片排序:将原列表切片 复制给新列表,再对新列表排序,同样可以实现排序且不改变原列表。
list1 = [1, 3, 2, 5]
print(id(list1))
list2 = list1[:]
print(id(list2))
list2.sort()
print(list2)
print(list1)
输出结果是:
2090106465984
2090106452096
[1, 2, 3, 5]
[1, 3, 2, 5]
使用切片法 复制给新列表创建的新列表和原列表是两个独立的列表,指向的内存地址都不同。如果直接用赋值法,那么两个列表将指向同一个内存地址,改变其中一个势必会改变另外一个。
5. sorted()对可迭代对象排序,包括对字符串、元组、字典。返回的都是列表,需要用其他函数来转换成其他类型。
str1 = '312'
print(sorted(str1))
print(reduce(lambda x,y:x+y, sorted(str1)))
print(''.join(sorted(str1)))
输出结果:
['1', '2', '3']
123
123
t = (3, 1, 5)
print(tuple(sorted(t)))
输出结果:
(1, 3, 5)
dict1 = {'name':'barren','age':28}
print(sorted(dict1))
输出结果:
['age', 'name']
对字典的排序是对键排序,不对值排序。
总结:sort()函数直接修改原列表,进行原地排序,这使其在处理大型数据集时具有显著的性能优势。sort()函数有两个重要参数:key和reverse. key参数允许我们指定一个函数,该函数将用于在比较元素时提取用于排序的键;而reverse参数则控制排序的顺序,设置为True时降序排序。
sorted()函数也用于排序,但它会返回一个新的已排序列表,而不修改原列表。这使得sorted()函数在需要保留原始列表顺序的场合下特别有用。