代码环境:python3.6
两者简单对比如下:
-
list.sort
是原列表排序,而sorted
会返回新列表; - 可选参数
key
和reverse
的意义和用法都一样。
reverse 用法最简单,reverse=True
时降序输出,reverse=False
时升序输出。这个参数的默认值是False
。
key 是一个函数,我们可以用 python 内置函数或自定义函数,让序列按我们想要的方式进行排序,下面我们用代码感受一下:
In [1]: a_list = [36, 5, -12, 9, -21]
In [2]: b_list = [36, 5, -12, 9, -21]
In [3]: sorted(a_list)
Out[3]: [-21, -12, 5, 9, 36]
In [4]: a_list
Out[4]: [36, 5, -12, 9, -21]
# 按映射后的绝对值排序
In [5]: sorted(a_list, key=abs)
Out[5]: [5, 9, -12, -21, 36]
In [6]: b_list.sort()
In [7]: b_list
Out[7]: [-21, -12, 5, 9, 36]
In [8]: c_list = ['bob', 'about', 'Zoo', 'Credit']
In [9]: sorted(c_list)
Out[9]: ['Credit', 'Zoo', 'about', 'bob']
# 忽略大小写,按字母顺序排序
In [10]: sorted(c_list, key=str.lower)
Out[10]: ['about', 'bob', 'Credit', 'Zoo']
# 按字符串长度排序
In [11]: sorted(c_list, key=len)
Out[11]: ['bob', 'Zoo', 'about', 'Credit']
上面我们只用了key
是内置函数的情况,下面用另一个例子看看key
是自定义函数的用法。
给出一个列表L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
,列表中每个元素包括了学生的姓名和成绩。要求:
- 按名字排序;
- 按成绩从高到低排序。
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def order_by_name(arg_tuple):
# 元组参数传进来直接映射为元祖的第1个元素,返回进行对比
return arg_tuple[0]
def order_by_score(arg_tuple):
# 元组参数传进来直接映射为元祖的第2个元素,返回进行对比
return arg_tuple[1]
if __name__ == "__main__":
print('默认排序结果:{}'.format(sorted(L)))
print('按姓名排序结果:{}'.format(sorted(L, key=order_by_name)))
print('按成绩排序结果:{}'.format(sorted(L, key=order_by_score, reverse=True)))
执行结果:
默认排序结果:[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
按姓名排序结果:[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
按成绩排序结果:[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]