Python 函数 | sorted 函数详解

博友们,你们好,很高兴能在这里和大家分享技术文章,我是 Amo Xiang,是一名在职企业员工,Amo 来源于上家公司的英文名,本意是 。作为刚入行几年互联网行业的小白,博主写博客一方面是为了记录自己的学习过程以及所犯的错误,更多的是希望能够帮助到很多处于起步阶段的萌新,让他们少走弯路。在编写文章时,参考了大量书籍及一些互联网大佬的资源,并结合了自己的工作经验,博主本着科学、严谨的态度、力求精益求精,但疏漏之处在所难免,敬请广大博友批评指正。博客主页:https://blog.csdn.net/xw1680?spm=1011.2124.3001.5113

1. sorted 函数的介绍

1.1 功能

sorted() 函数用于对可迭代对象进行 排序,返回一个重新排序的列表,当使用该函数进行排序后,原列表的元素顺序不变。

1.2 语法

sorted(iterable, key=None, reverse=False):参数说明如下:
iterable:表示可迭代对象,如列表、字符串、字典等。
key:可选参数,可选参数 key 是一个函数(方法),用来指定排序的规则(即按照指定的方法或函数对
可迭代对象进行排序)。例如,设置 key=str.lower,表示可迭代对象中的每个元素转换为小写字母后
再进行排序,返回的仍然是可迭代对象中的元素。默认 key=None,表示直接比较元素进行排序。
reverse:可选参数,排序规则,默认 reverse=False,表示升序排列,如果 reverse=True,则
表示降序排列。
返回值:返回重新排序的列表。

2. sorted 函数的应用

2.1 对数字列表进行排序

定义一个保存 10 名学生高考理科成绩在 600 分以上的列表,然后应用 sorted() 函数对其进行升序和降序排列,代码如下:

grade_list = [656, 602, 610, 618, 663, 695, 622, 645, 677, 640]  # 10名600分以上的学生成绩列表
# 升序列表: [602, 610, 618, 622, 640, 645, 656, 663, 677, 695]
print(f"升序列表: {sorted(grade_list)}")  # 升序排序
# 降序列表: [695, 677, 663, 656, 645, 640, 622, 618, 610, 602]
print(f"降序列表: {sorted(grade_list, reverse=True)}")  # 降序排序

2.2 对字符列表进行排序

定义一个保存字符的列表,然后应用 sorted() 函数对其进行排序,并指定参数 key=str.lower,代码如下:

char_list = ['a', 'b', 'c', 'd', '*', 'M', 'R', 'S', 'O', 'F', 'T']  # 定义列表
# 默认按字符ASCII码进行排序
# 升序: ['*', 'F', 'M', 'O', 'R', 'S', 'T', 'a', 'b', 'c', 'd']
print(f"升序: {sorted(char_list)}")  # 进行升序排列
# 降序: ['d', 'c', 'b', 'a', 'T', 'S', 'R', 'O', 'M', 'F', '*']
print(f"降序: {sorted(char_list, reverse=True)}")  # 进行降序排列
# 转换为小写字母后升序: ['*', 'a', 'b', 'c', 'd', 'F', 'M', 'O', 'R', 'S', 'T']
print(f"转换为小写字母后升序: {sorted(char_list, key=str.lower)}")
# 转换为小写字母后升序: ['T', 'S', 'R', 'O', 'M', 'F', 'd', 'c', 'b', 'a', '*']
print(f"转换为小写字母后升序: {sorted(char_list, key=str.lower, reverse=True)}")

* 的 ASCII 值为 41,A 的 ASCII 值为 65,a 的 ASCII 值为 97。

2.3 按照列表中嵌套元组的指定元素进行排序

依据英语小 A 班学生列表 students 中元组的第 1 个下标值 (年龄) 和 第 2 个下标值 (身高) 进行升序和降序排列,代码如下:

# 定义列表(姓名、年龄、身高)
students = [('Adas', 3, 99), ('Lily', 4, 110), ('Bella', 4, 112), ('Anna', 3, 95)]
s1 = sorted(students, key=lambda x: x[2])  # 按身高进行升序排列
print('按身高升序:', s1)
s2 = sorted(students, key=lambda x: x[2], reverse=True)  # 按身高进行降序排列
print('按身高降序:', s2)
s3 = sorted(students, key=lambda x: x[1])  # 按年龄进行升序排列
print('按年龄升序:', s3)
s4 = sorted(students, key=lambda x: x[1], reverse=True)  # 按年龄进行降序排列
print('按年龄降序:', s4)

程序运行结果如下:
在这里插入图片描述

2.4 将数字按绝对值进行排序

定义一个含有多个正负数的列表,然后应用 sorted() 函数对其进行排序,并指定参数 key=abc,代码如下:

s = [39, 15, -12, 9, -21, 66]
s_positive = sorted(s)  # 正常排序
print(s_positive)
s_negative = sorted(s, key=abs)  # 按绝对值排序
print(s_negative)

程序运行结果如下:
在这里插入图片描述

扫描二维码关注公众号,回复: 12120704 查看本文章

2.5 将数字和数字字符串进行排序

在一组数据列表中,有时候可能会混入一些为字符串格式的数字,在 Python3 中是不能将字符串与数字进行比较的,而是需要使用 functools模块 中的 cmp_to_key 来指定比较函数是什么。代码如下:

import functools


def compare(x1, x2):
    if isinstance(x1, str):
        x1 = float(x1)
    if isinstance(x2, str):
        x2 = float(x2)
    return x1 - x2


nums = [3.9, 15, -1.2, 9, -21, 6.6, '-1', '2.4', '-3.3']
nums_sort = sorted(nums, key=functools.cmp_to_key(compare))
# 输出==>[-21, '-3.3', -1.2, '-1', '2.4', 3.9, 6.6, 9, 15]
print(nums_sort)

2.6 通过 key 的值对字典进行排序

定义一个包含多个字典的列表,然后应用 sorted() 函数对其进行排序,并指定参数 key=lambda x:x[“age”]。代码如下:

age_name = [{
    
    "age": 20, "name": "coc"},
            {
    
    "age": 25, "name": "ctt"},
            {
    
    "age": 10, "name": "ctc"}]
age_name_sort = sorted(age_name, key=lambda x: x["age"])  # 通过字典中的age进行排序
# [{'age': 10, 'name': 'ctc'}, {'age': 20, 'name': 'coc'}, {'age': 25, 'name': 'ctt'}]
print(age_name_sort)

2.7 通过字符串的长度来进行排序

定义一个带有多个字符串的列表,然后应用 sorted() 函数对其进行排序,并指定参数 key=len,或者使用 lambda 表达式,代码如下:

chars = ['Sorted', 'is', 'age', 'name', 'is', 'string', 'test']
chars_sort = sorted(chars, key=len)
print(chars_sort)  # 输出:['is', 'is', 'age', 'name', 'test', 'Sorted', 'string']
chars_sort_lambda = sorted(chars, key=lambda x: len(x))
print(chars_sort_lambda)  # 输出:['is', 'is', 'age', 'name', 'test', 'Sorted', 'string']

2.8 使用自定义的方法进行排序

在使用 sorted() 函数进行排序的过程中,key 参数除了可以使用内置的函数和匿名函数外,也可使用自定义的方法。如下所示:

def my_sorted_method(word):
    number, letter, other = [], [], []
    for i in word:
        if i.isdigit():  # 判断是否为数字
            number.append(i)
        elif i.isalpha():  # 判断是否为字母
            letter.append(i)
        else:
            other.append(i)
    list_all = sorted(number + letter + other)  # 排序并合并
    return list_all


x = ['5', 'e', 'c', 'fe', (), '1', 'a']
x_my = sorted(x, key=my_sorted_method)
print(x_my)  # [(), '1', '5', 'a', 'c', 'e', 'fe']

2.9 对类的实例对象进行排序

如果要排序的元素是自定义类,例如使用 Student 类中的 age 参数来排序。代码如下:

class Student(object):
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):
        return repr((self.name, self.grade, self.age))


s_examples = [
    Student('coc', 'A', 15),
    Student('dod', 'B', 12),
    Student('god', 'A', 12),
    Student('cod', 'B', 10), ]
s_examples_sorted = sorted(s_examples, key=lambda t: t.age)  # 使用类的age属性进行排序
# [('cod', 'B', 10), ('dod', 'B', 12), ('god', 'A', 12), ('coc', 'A', 15)]
print(s_examples_sorted)

2.10 使用多个条件排序

在根据类中的某个属性进行排序时,难免会出现相同的元素,此时可以再指定一条属性用于排序。代码如下:

class Student(object):
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):
        return repr((self.name, self.grade, self.age))


s_examples = [
    Student('coc', 'A', 15),
    Student('dod', 'B', 12),
    Student('god', 'A', 12),
    Student('cod', 'B', 10), ]
s_examples_age_grade = sorted(s_examples, key=lambda t: (t.age, t.grade))  # 使用多个条件排序
print(s_examples_age_grade)

2.11 自定义类的高效排序

对于自定义类,还有一种更高效的方法用于指定 key,引入 operator 模块下的 attrgetter 类,再将排序的元素传入其中。代码如下:

from operator import attrgetter


class Student:
    def __init__(self, name, grade, age):

        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):

        return repr((self.name, self.grade, self.age))


s_examples = [
    Student('coc', 'A', 15),
    Student('dod', 'B', 12),
    Student('god', 'A', 12),
    Student('cod', 'B', 10), ]
s_examples_age_grade = sorted(s_examples, key=lambda t: (t.age, t.grade))  # 使用多个条件排序
print(s_examples_age_grade)

s_examples_agttr = sorted(s_examples, key=attrgetter('age', 'grade'))  # 使用多个条件排序
print(s_examples_agttr)

3. sorted 函数在列表中的应用

在 Python 中,提供了一个内置的 sorted() 函数,用于对列表进行排序。使用该函数进行排序后,原列表的元素顺序不变。

3.1 对 10 名学生 Python 理论成绩进行排序

定义一个保存 10 名学生 Python 理论成绩的列表,然后应用 sorted() 函数对其进行排序,代码如下:

grade = [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]  # 10名学生Python理论成绩列表
grade_as = sorted(grade)  # 进行升序排列
print('升序:', grade_as)
grade_des = sorted(grade, reverse=True)  # 进行降序排列
print('降序:', grade_des)
print('原序列:', grade)

程序运行结果如下:
在这里插入图片描述
列表对象的 sort() 方法 和 内置 sorted() 函数的作用基本相同,所不同的就是使用 sort() 方法时,会改变原列表的元素排列顺序,而使用 sorted() 函数时,会建立一个原列表的副本,该副本为排序后的列表。

3.2 排序在中位数中的应用

在数据统计过程中,经常会用到中位数。首先了解一下什么是中位数。在数据排序后,位置在最中间的数值就是中位数。当数据样本数为奇数时,中位数就是最中间的数值,如 1、2、3、4、5 这 5 个数,中位数是中间的数字 3,当数据样本数为偶数时,中位数则是中间两个数的平均值,如 1、2、3、4、5、6 这 6 个数,中位数是 3.5。

下面通过程序统计某单位员工年龄的中位数。抽取 10 名员工,年龄分别为 23、32、45、20、25、28、30、35、26、41。首先对这组数据进行排序,然后统计年龄的中位数,代码如下:

num = [23, 32, 45, 20, 25, 28, 30, 35, 26, 41]  # 一组年龄数据
data = sorted(num)  # 排序
n = len(data)  # 列表的长度(即数据的个数)
# 通过列表索引获取指定位置的年龄,然后统计年龄的中位数
media = (data[n // 2] + data[n // 2 - 1]) / 2
print("年龄的中位数是: ", media)

程序运行结果如下:
在这里插入图片描述

3.3 将包括数字、字符、中文汉字的字符串列表按数值大小排序

如果一个列表中元素为字符串类型的浮点数、整数和带中文标识的数,如 -2、-1.1、-1、1、1.3、1层、2。现在需要将其按元素中的数值进行排序。排序后的结果为 -2、-1.1、-1、1、1层、1.3、2。这时可以通过使用 sorted() 函数,并且指定排序关键字实现。代码如下:

import re  # 导入正则表达式模块

list1 = ['-2', '-1.1', '-1', '1', '1.3', '1层', '2']
print('未排序:', list1)

list1 = sorted(list1, key=lambda x: (float(re.sub('[\u4e00-\u9fa5]', '', x))))
# 未排序: ['-2', '-1.1', '-1', '1', '1.3', '1层', '2']
print('已排序:', list1)
# 已排序: ['-2', '-1.1', '-1', '1', '1层', '1.3', '2']

3.4 将中文列表按拼音顺序排序

在 Python 中,进行中文汉字排序时,默认按汉字的 Unicode 编码进行排序,这种排序结果和我们常见的按拼音顺序排序不一样。通过借助 第三方模块xpinyin 和自定义排序规则可以实现 按拼音顺序排序 中文。具体步骤如下:

(1) 安装第三方模块 xpinyin。在 CMD 命令行窗口中,输入以下安装命令:
在这里插入图片描述
(2) 导入 xpinyin 模块,代码如下:

from xpinyin import Pinyin  # 导入汉字转拼音模块

(3) 编写自定义函数,作为按中文汉字排序的规则。在该函数中,首先应用第三方模块 xpinyin 的 get_pinyin() 方法获取中文汉字的拼音,并且和对应的汉字放到一个元组中,再添加到列表中,然后对该列表排序,最后遍历排序后的列表,取出汉字保存到新列表中返回。具体代码如下:

from xpinyin import Pinyin  # 导入汉字转拼音模块


def my_sort(wordlist):  # 指定要排序的列表
    pin = Pinyin()  # 创建汉字转拼音对象
    temp = []  # 保存转换结果的空列表
    for item in wordlist:  # 遍历品牌名称列表
        # 将汉字的拼音和汉字放到一个元组中,再添加到列表中
        temp.append((pin.get_pinyin(item), item))
    temp.sort()  # 对列表进行排序
    result = []  # 保存排序后的列表
    for i in range(len(temp)):  # 遍历排序后的列表
        result.append(temp[i][1])  # 取出汉字保存到新列表中
    return result  # 返回排序后的列表

(4) 定义要排序的列表,并且应用 sorted() 函数按指定的规则进行排序,代码如下:

friend = ['天净沙秋思', '大鱼', 'Aurora', '宁静致远', '丁灵儿', '恒则成']
print('排序前:', friend)
newfriend = sorted(friend, key=lambda i: my_sort(friend).index(i))
print('排序后:', newfriend)

程序运行结果如下:
在这里插入图片描述
感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/111183578