Python - sort()、sorted()的区别

持续创作,加速成长!这是我参与「掘金日新计划 · 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 码,且逐一字符对比

  • 先对比每个字符串的第一个字符:FBVV,V 最大,B 最小,因为有两个 V,所以比较第二个字符
  • 若第一个字符相同,则比较第二个字符,oa,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']
复制代码
分类:
后端