Python实例:根据字典值对字典进行排序的三种方法

Python实例:根据字典值对字典进行排序的三种方法

一、实际场景及解决思路

实际场景:比如某个班的数学成绩以字典格式存储为:

student_dict = {
    'xiaoliang': 81,
    'xiaowang' : 92,
    'xiaoxin'  : 99,
    ......

}

实际的词典存储是随机排序的。本文提出了一种根据每个学生的成绩对学生词典格式数据进行排序并将排序结果返回给词典的解决方案。

[En]

The actual dictionary storage is sorted randomly. This paper gives a solution to sort the student dictionary format data according to each student’s score and return the sorting results to the dictionary.

解决思路:将字典中的元素转换为元组,使用内置函数 sorted排序。由于Python内置方法 sorted并不能直接对字典进行操作,所以需要首先将字典格式数据转换为元组列表数据格式,然后使用 sorted进行排序,常用的方法包括三种:

  • 方法1使用列表解析方法实现
  • 方法2(推荐)使用 zip 方法实现
  • 方法3(高级用法): *传递 sorted 函数的 key 参数

二、字典排序的三种实现方法

2.1 使用列表解析方法实现字典排序

方案1使用列表解析方法实现

(1)使用列表解析方法将字典中的像转化为 (value, key)的元组格式,然后使用 sorted方法实现排序;
(2)注意:元组比较大小是根据第一个元素 value决定的输出的真假,当第一个元素 value相同时候,才比较第二个,依次类推。

Python代码如下所示:

from random import randint

student_dict = {'student_%d' % i: randint(50, 100)
                                for i in range(1, 21)}

student_tuplelist = [(stu_value, stu_key) for stu_key, stu_value
                    in student_dict.items()]

print(student_tuplelist)

student_tuplelist_sorted = sorted(student_tuplelist,
                                        reverse=True)

print(student_tuplelist_sorted)

代码执行结果如下图所示:

Python实例:根据字典值对字典进行排序的三种方法

2.2 使用 zip 方法实现字典排序

(1)使用 zip方法将字典中的像转化为 (value, key)的元组格式,然后使用 sorted方法实现排序;
(2)注意 zip的输出为一个zip对象(zip object),需要使用列表构造器 list才能转换为元组列表;
(3)结合下图 zip函数的功能,使用 zip将学生字典转换为元组列表的方法为: list(zip(student_dict.values(), student_dict.keys()))

Python实例:根据字典值对字典进行排序的三种方法
Python代码如下所示:
from random import randint

student_dict = {'student_%d' % i: randint(50, 100)
                                for i in range(1, 21)}

student_tuplelist = list(zip(student_dict.values(),
                                    student_dict.keys()))

print(student_tuplelist)

student_tuplelist_sorted = sorted(student_tuplelist,
                                        reverse=True)

print(student_tuplelist_sorted)

2.3 使用传递 sorted 函数的 key 参数实现字典排序

(1)由于 sorted方法有一个 key参数,它可以指定排序对象是按照字典哪类元素(键值或者值)进行排序;
(2)需要注意的是对于 key参数我们需要使用 lambda匿名函数作为迭代器 key=lambda x: x[1],依次访问学生字典的值; sorted函数的学生字典传入方法为 student_dict.items()
(3)使用sorted函数的key参数对字典数据进行排序,代码显得更加简洁。

Python实现代码如下所示:

from random import randint

student_dict = {'student_%d' % i: randint(50, 100)
                                for i in range(1, 21)}

student_tuplelist_sorted = sorted(student_dict.items(),
                                key=lambda x: x[1], reverse=True)

print(student_tuplelist_sorted)

Python实例:根据字典值对字典进行排序的三种方法

三、将sorted排序的列表返回给字典

上面三种方案对学生字典数据进行排序后返回的是一个元素为元组的列表,而如果我们需要的还是字典格式,可以使用python的内置函数 enumerate实现。对返回的元组列表排序结果使用 enumerate后的输出为一个枚举对象(enumerate object),结果如下图所示:

Python实例:根据字典值对字典进行排序的三种方法
这里需要使用列表生成器 list(enumerate(student_tuplelist_sorted, 1))读取其中的元素,其中参数 1表示初始标号为1,输出结果如下图所示:

Python实例:根据字典值对字典进行排序的三种方法
由上图可以看出, enumerate函数的输出元组列表格式为 (序号, ('student_x', 考试分数))。使用 for循环可以依次读取 enumerate中的内容,并重新构建学生字典。代码如下所示:
from random import randint

student_dict = {'student_%d' % i: randint(50, 100)
                                for i in range(1, 21)}

student_tuplelist_sorted = sorted(student_dict.items(),
                            key=lambda x: x[1], reverse=True)

student_dict_sorted = {}
for rank, (stu_key, stu_val) in enumerate(
                            student_tuplelist_sorted, 1):

    student_dict_sorted[stu_key] = (rank, stu_val)

print("带有名次的排序后学生字典:", student_dict_sorted)

代码执行结果如下图所示:

Python实例:根据字典值对字典进行排序的三种方法

Original: https://blog.csdn.net/weixin_37926734/article/details/124028703
Author: 嵌入式技术
Title: Python实例:根据字典值对字典进行排序的三种方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/222757/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总