版权声明:本文为CSDN博主「Vince Li」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43250623/article/details/88829341
sort和sorted的区别
虽然python3中sort()和sorted()都可以用来排序,但二者有以下两个最主要的区别:
sort只能应用在列表list上,而sorted可以对所有可迭代的对象进行排序的操作
sort方法会在原list上直接进行排序,不会创建新的list。而sorted方法不会对原来的数据做任何改动,排序后的结果是新生成的。
如果我们不需要原来的数据而且数据是list类型,可以用sort方法,能够节省空间。否则要用sorted方法。
sort
在python3中有key和reverse两个可选参数。参数reverse指定排序是升序还是降序,默认是升序参数key指定了只含一个参数的方法,这个方法用来从列表的每个元素中提取比较键。可以看看下面几个例子:
1.通过元素长度排序
s_list = ["bbb","ccc","bac","ab","ba"]
s_list.sort(key=len) # key=len 指定排序规则按长度排序
print(s_list)
1
2
3
打印结果如下:
['ab', 'ba', 'bbb', 'ccc', 'bac']
1
2.通过元素的字符顺序
s_list = ["bbb","BBB","bAc","ab","bac"]
s_list.sort() # 默认升序
print(s_list)
s_list.sort(key=str.lower) # 先小写再大写
print(s_list)
1
2
3
4
5
打印结果如下:
['BBB', 'ab', 'bAc', 'bac', 'bbb']
['ab', 'bAc', 'bac', 'BBB', 'bbb']
1
2
3.更复杂一点的排序:list里的元素是一个字典,通过字典的某个属性值排序。
下面是通过学生的年龄排序
student = [{"name": "小C", "age": 12, "score": 90},
{"name": "小D", "age": 13, "score": 84},
{"name": "小A", "age": 14, "score": 85},
{"name": "小E", "age": 15, "score": 89},
{"name": "小F", "age": 12, "score": 88}]
student.sort(key=lambda a: a["age"])
# 此方法是对list的元素进行排序,每一个元素是一个字典,按字典中的age进行排序,但不能直接对字典进行排序,sort的操作对象只能是list
print(student)
1
2
3
4
5
6
7
8
打印结果如下:
[{'name': '小C', 'age': 12, 'score': 90},
{'name': '小F', 'age': 12, 'score': 88},
{'name': '小D', 'age': 13, 'score': 84},
{'name': '小A', 'age': 14, 'score': 85},
{'name': '小E', 'age': 15, 'score': 89}]
1
2
3
4
5
由于sort只有list类型才可以用属于列表的成员方法,所以用的更普遍的是sorted方法,下面来说下sorted方法
注意:sort只有list类型才可以用
注意:sort只有list类型才可以用
注意:sort只有list类型才可以用
返回值
sort方法会在原list上直接进行排序,不会创建新的list,所以sort没有返回值或者说返回None
sorted
所有可迭代对象都可以用sorted来进行排序,排序不会改变原来的对象。sorted接收3个参数:
sorted一共有iterable, key, reverse这三个参数;
sorted(iterable, , key=None, reverse=False)
参数 作用
iterable 可迭代对象 , 例如: dict.items()、dict.keys()等
key 用来选取参与比较的元素, 例如确定是按照字典的键比较还是按照值进行比较
reverse 用来指定排序是升序还是降序,reverse=true是降序,false时则是升序,默认时是升序
看下面一个小例子:
s_tuples = [('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10)]
new_tuples = sorted(s_tuples , key=lambda student: student[2]) # student[2]表示按照列表中的元组中的第三个元素的大小进行排序
print(s_tuples )
print(new_tuples)
1
2
3
4
5
6
打印结果如下:
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] # 原始的
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] # 排序过的
1
2
新列表是通过年龄排序的,从打印结果可以看出没有改变原数据
这种含有key参数的方法使用十分普遍
2,对字典的值进行排序
a = { "b": 5, "c": 2,"a": 4, "d": 1}
#对字典按值(value)进行排序(默认由小到大)
test_2=sorted(a.items(),key=lambda x:x[1])
#输出结果
print(test_2)
1
2
3
4
5
打印结果为:
[('d', 1), ('c', 2), ('a', 4), ('b', 5)] # 对值进行了排序
1
返回值
sorted方法不会对原来的数据做任何改动,排序后的结果是新生成的。所以sorted会返回一个排序过的列表
————————————————