持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
语法
sort()
list.sort(reverse=True|False, key=myFunc)
复制代码
-
reverse: 可选的,reverse=True 将对列表进行降序排序,默认 False
-
key: 可选的,指定排序标准的函数
sorted()
sorted(iterable, key=key, reverse=reverse)
复制代码
-
iterbale: 必传的,可迭代对象,比如字典、列表、元组
-
key: 可选的,指定排序标准的函数
-
reverse: 可选的,reverse=True 将对列表进行降序排序,默认 False
作用
sort 与 sorted 区别
- sort:应用在 list 上的方法
- sorted:可以对所有可迭代的对象进行排序操作
重点
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值
li = [[1, 7], [1, 5], [2, 4], [1, 1]]
print(id(li))
li.sort()
print(id(li))
# 输出,同一个变量
4310238336
4310238336
复制代码
而函数 sorted 返回的是一个新的 list,而不是在原来的基础上进行的操作
li = [[1, 7], [1, 5], [2, 4], [1, 1]]
print(id(li))
li = sorted(li)
print(id(li))
# 输出,一个新的对象
4547508480
4547527040
复制代码
sort() 的例子
默认使用
从小到大排序
l = [1, 56, 7, 123, 5, 6, 78]
li.sort()
print(l)
# 输出
[1, 5, 6, 7, 56, 78, 123]
复制代码
逆序
从大到小
cars = ['Ford', 'BMW', 'Volvo', 'Va']
cars.sort(reverse=True)
print(cars)
# 输出
['Volvo', 'Va', 'Ford', 'BMW']
复制代码
字符是对比 ASCII 码,且逐一字符对比
- 先对比每个字符串的第一个字符:
F
、B
、V
、V
,V 最大,B 最小,因为有两个 V,所以比较第二个字符 - 若第一个字符相同,则比较第二个字符,
o
、a
,o 最大,所以Volvo
>Va
在线ASCII 码表:tool.oschina.net/commons?typ…
修改排序规则例子一
li = [[1, 7], [1, 5], [2, 4], [1, 1]]
li.sort()
print(li)
# 输出
[[1, 1], [1, 5], [1, 7], [2, 4]]
复制代码
默认按照第一个元素排序,如果第一个元素相同,按照第二个元素排序
需求:修改成先按照第二个元素排序,如果第二个元素相同,按照第一个元素排序
li = [[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
def sort_key(x):
return x[1], x[0]
li.sort(key=sort_key)
print(li)
# 输出
[[1, 1], [3, 1], [2, 4], [1, 5], [1, 7]]
复制代码
改需求:按照第二个元素进行逆序排序,按照第一个元素进行顺序排序
li = [[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
def sort_key(x):
# 改成负数即可
return -x[1], x[0]
li.sort(key=sort_key)
print(li)
# 输出
[[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
复制代码
修改排序规则例子三
def myFunc(e):
return len(e)
cars = ['Ford', 'Mitsubishi', 'BMW', 'VW']
cars.sort(key=myFunc)
print(cars)
# 输出
['VW', 'BMW', 'Ford', 'Mitsubishi']
复制代码
修改成按照字符串长度进行排序
针对字典进行排序
cars = [ {'car': 'Ford', 'year': 2005}, {'car': 'Mitsubishi', 'year': 2000}, {'car': 'BMW', 'year': 2019}, {'car': 'VW', 'year': 2011}]
cars.sort()
# 运行
Traceback (most recent call last):
File "sorted.py", line 70, in <module>
cars.sort()
TypeError: '<' not supported between instances of 'dict' and 'dict'
复制代码
报错了,从这个报错可以看出,如果列表内的元素不支持<
、>
比较运算符,就会报错,这个时候就要指定排序函数来排序
def myFunc(e):
return e['year']
cars = [
{'car': 'Ford', 'year': 2005},
{'car': 'Mitsubishi', 'year': 2000},
{'car': 'BMW', 'year': 2019},
{'car': 'VW', 'year': 2011}
]
cars.sort(key=myFunc)
print(cars)
# 输出
[{'car': 'Mitsubishi', 'year': 2000}, {'car': 'Ford', 'year': 2005}, {'car': 'VW', 'year': 2011}, {'car': 'BMW', 'year': 2019}]
复制代码
按照字典的 year 键进行排序
使用 lambda 改造上面的例子
前言
从上面的例子可以看到,key=
参数指定的函数只需要传一个参数,且排序规则大部分情况下一两行代码即可完成,可以考虑 lambda 表达式进行优化
简单复习下 lambda 表达式
# 例子一
def func(x):
return x
# 等价 lambda
lambda x: x
# 例子二
def func(x):
return x*2
# 等价 lambda
lambda x: x*2
# 例子三
def func(x):
return x[1],x[2]
# 等价 lambda
lambda x: (x[1],x[2])
# 例子四
def func(a,b):
return a+b
# 等价 lambda
lambda a,b: a+b
复制代码
开始改造
修改排序规则例子一
需求:修改成先按照第二个元素排序,如果第二个元素相同,按照第一个元素排序
li = [[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
li.sort(key=lambda x: (x[1], x[0]))
print(li)
# 输出
[[1, 1], [3, 1], [2, 4], [1, 5], [1, 7]]
复制代码
重点:如果要通过 lambda 表达式返回多个变量,需要写成元组的格式(a,b,c,...)
改需求:按照第二个元素进行逆序排序,按照第一个元素进行顺序排序
li = [[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
li.sort(key=lambda x: (-x[1], x[0]))
print(li)
# 输出
[[1, 7], [1, 5], [2, 4], [1, 1], [3, 1]]
复制代码
修改排序规则例子三
cars = ['Ford', 'Mitsubishi', 'BMW', 'VW']
cars.sort(key=lambda x: len(x))
print(cars)
# 输出
['VW', 'BMW', 'Ford', 'Mitsubishi']
复制代码
修改成按照字符串长度进行排序
针对字典进行排序
cars = [ {'car': 'Ford', 'year': 2005}, {'car': 'Mitsubishi', 'year': 2000}, {'car': 'BMW', 'year': 2019}, {'car': 'VW', 'year': 2011}]
cars.sort(key=lambda x: x['year'])
print(cars)
# 输出
[{'car': 'Mitsubishi', 'year': 2000}, {'car': 'Ford', 'year': 2005}, {'car': 'VW', 'year': 2011}, {'car': 'BMW', 'year': 2019}]
复制代码
按照字典的 year 键进行排序
sorted() 例子,不再重复太多~
列个基础使用🌰
a = ("h", "b", "a", "c", "f", "d", "e", "g")
x = sorted(a)
print(x)
# 输出
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
a = ("h", "b", "a", "c", "f", "d", "e", "g")
x = sorted(a, reverse=True)
print(x)
# 输出
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
复制代码