Python sort()和sorted()
Python sort()和sorted()
sort 与 sorted 区别:
sort()
sort()是列表list的方法之一
L.sort(key=None, reverse=False)
sorted()
sorted() 函数可以对任意可迭代对象排序。返回一个列表
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的list,而不是在原来的基础上进行的操作
# sorted()语法
sorted(iterable[, cmp[, key[, reverse]]])
参数说明:
- iterable -- 可迭代对象
- cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
单个排序法则:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
new_students = sorted(students, key=lambda s: s[2])
print(new_students) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
多种排序法则:
s = 'asdf234GDSdsf234578' # 排序:小写-大写-奇数-偶数
new_s1 = "".join(sorted(s, key=lambda x: [x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x]))
print(new_s1) # addffssDGS335722448
原理:
print(sorted([True, False])) # [False, True]
# Boolean 的排序会将 False 排在前,True排在后
-
x.isdigit()的作用把iterable分成两部分,数字和非数字,数字在后,非数字在前
new_s1 = "".join(sorted(s, key=lambda x: [x.isdigit()])) print(new_s1) # asdfGDSdsf234234578
-
x.isdigit() and int(x) % 2 == 0的作用是将数字部分分成两部分,偶数(在后)和奇数(在前)
new_s1 = "".join(sorted(s, key=lambda x: [x.isdigit(), x.isdigit() and int(x) % 2 == 0])) print(new_s1) # asdfGDSdsf335724248
-
x.isupper()的作用是在前面基础上,保证字母小写在前大写在后
new_s1 = "".join(sorted(s, key=lambda x: [x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper()])) print(new_s1) # asdfdsfGDS335724248
-
最后的x表示在前面基础上,对所有类别数字或字母排序
new_s1 = "".join(sorted(s, key=lambda x: [x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x])) print(new_s1) # addffssDGS335722448
一道面试题
lst = [7, -8, 5, 4, 0, -2, -5]
要求:
- 正数在前负数在后
- 正数从小到大
- 负数从大到小
lst = [7, -8, 5, 4, 0, -2, -5]
new_lst1 = sorted(lst, key=lambda x: [x < 0, x < 0 and -x, x >= 0 and x]) # -3 < 0 and -(-3) ==> 3
new_lst2 = sorted(lst, key=lambda x: [x < 0, abs(x)])
print(new_lst1) # [0, 4, 5, 7, -2, -5, -8]
print(new_lst2) # [0, 4, 5, 7, -2, -5, -8]