python中的字典(dict)排序

前言

在Python中,字典(dict)本身是无序的,直到Python 3.7版本,字典在迭代时会保持插入顺序。如果你需要根据键(key)或值(value)对字典中的项进行排序,可以使用内置的sorted()函数,它返回一个排序后的列表。

生成模拟数据

先安装uuid

pip3 install uuid
# 模拟测试的数据
import random
import uuidtest_data = {}
for i in range(1, 10):test_data[str(uuid.uuid4())] = (random.randint(1, 100), random.randint(1000, 9999))print(f"模拟的数据  :{test_data}")

输出的数据:

模拟的数据  :{'d0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), '088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324), '33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), '904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842)}

实现

根据键(Key)排序:

# 排序的根据:item[0]为取字典的key
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[0]))print(f"排序后的数据:{sorted_dict}")

输出:

排序后的数据:{'088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), '33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), '904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985)}

根据值(Value)排序:

排序

# 排序的根据:item[1]为取字典的value(元组),再一个[0]取元组的第一个元素
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[1][0]))print(f"排序后的数据:{sorted_dict}")# 排序的根据:item[1]为取字典的value(元组),再一个[1]取元组的第2个元素
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[1][1]))print(f"排序后的数据:{sorted_dict}")

输出:

排序后的数据:{'904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842), '33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), '088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324)}
排序后的数据:{'088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), '904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), '33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203)}

降序

如果你想根据字典的值进行降序排序,可以在 sorted() 函数中添加一个参数 reverse=True。这会告诉函数返回一个降序排序的列表,然后你可以将这个列表转换成字典。

# 排序的根据:item[1]为取字典的value(元组),再一个[0]取元组的第一个元素,降序
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[1][0], reverse=True))print(f"排序后的数据:{sorted_dict}")# 排序的根据:item[1]为取字典的value(元组),再一个[1]取元组的第2个元素,降序
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[1][1], reverse=True))print(f"排序后的数据:{sorted_dict}")

输出:

排序后的数据:{'088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), '33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), '904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842)}
排序后的数据:{'33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994), 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5': (89, 5985), '22109c71-cd32-4470-854f-8db16faee701': (74, 5404), '75840f3c-bfe5-46db-a497-c09f188340e7': (86, 4193), '904aa218-7624-497b-8ea4-fc778cbc5790': (5, 1842), '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b': (90, 1424), '088ac61e-3cd0-4151-95cf-89c48896e3b1': (91, 1324)}

取top N

降序排序后,使用切片操作来获取前N个元素。

# 排序的根据:item[1]为取字典的value(元组),再一个[1]取元组的第2个元素,降序,取Top 3
sorted_dict = dict(sorted(test_data.items(), key=lambda item: item[1][1], reverse=True)[:3])print(f"排序后的数据:{sorted_dict}")

在这个例子中,sorted()函数首先根据每个项的值(item[1][1])进行排序,然后通过设置reverse=True来实现降序排序。接着,使用切片[:3]来获取排序后列表的前3个元素。最后,使用dict()函数将这个列表转换成一个新的字典。

请注意,如果原始字典中的元素少于3个,上述代码将返回所有元素。如果字典中的元素多于3个,它将只返回前3个根据值降序排序的项。此外,由于字典在Python 3.7及以后版本中是有序的,这意味着sorted_dict_by_key将按照排序后的顺序保持键的顺序。

输出:

排序后的数据:{'33150465-f728-43dd-957a-05fcb1913b6b': (11, 7203), 'd0cf8b90-a727-4ddb-80b8-0895b9048521': (77, 6566), 'ed999515-86ae-45da-94ae-ec5ea54e2c19': (43, 5994)}

使用collections模块的OrderedDict

虽然从Python 3.7开始,普通字典就保持了插入顺序,但在更早的版本中,或者在你需要明确指定排序依据的情况下,可以使用collections.OrderedDict

from collections import OrderedDict# 根据值排序并创建OrderedDict
sorted_dict = OrderedDict(sorted(test_data.items(), key=lambda item: item[1][0]))print(f"排序后的数据:{sorted_dict}")

输出:

排序后的数据:OrderedDict([('904aa218-7624-497b-8ea4-fc778cbc5790', (5, 1842)), ('33150465-f728-43dd-957a-05fcb1913b6b', (11, 7203)), ('ed999515-86ae-45da-94ae-ec5ea54e2c19', (43, 5994)), ('22109c71-cd32-4470-854f-8db16faee701', (74, 5404)), ('d0cf8b90-a727-4ddb-80b8-0895b9048521', (77, 6566)), ('75840f3c-bfe5-46db-a497-c09f188340e7', (86, 4193)), ('f445a442-75f1-4bc8-b5fd-d307dacd8ca5', (89, 5985)), ('6dc09e8d-cb6c-419d-8761-dcb2e711ce8b', (90, 1424)), ('088ac61e-3cd0-4151-95cf-89c48896e3b1', (91, 1324))])

仅返回排序后的键或值列表:

如果你只需要排序后的键或值列表,而不是一个新的字典,可以直接返回sorted()函数的结果:

# 返回排序后的键列表
sorted_dict = sorted(test_data.keys())
print(f"排序后的数据:{sorted_dict}")# 返回排序后的值列表
sorted_dict = sorted(test_data.values())
print(f"排序后的数据:{sorted_dict}")

输出:

排序后的数据:['088ac61e-3cd0-4151-95cf-89c48896e3b1', '22109c71-cd32-4470-854f-8db16faee701', '33150465-f728-43dd-957a-05fcb1913b6b', '6dc09e8d-cb6c-419d-8761-dcb2e711ce8b', '75840f3c-bfe5-46db-a497-c09f188340e7', '904aa218-7624-497b-8ea4-fc778cbc5790', 'd0cf8b90-a727-4ddb-80b8-0895b9048521', 'ed999515-86ae-45da-94ae-ec5ea54e2c19', 'f445a442-75f1-4bc8-b5fd-d307dacd8ca5']
排序后的数据:[(5, 1842), (11, 7203), (43, 5994), (74, 5404), (77, 6566), (86, 4193), (89, 5985), (90, 1424), (91, 1324)]

注意:

  • sorted()函数返回的是一个列表,需要将排序后的项转换回字典时,使用dict()函数,如上面的例子所示。

  • 从Python 3.6开始,字典的键必须是不可变类型,这是因为字典的键需要能够被哈希化,以便在字典中快速定位和访问。不可变类型如整数、浮点数、字符串、元组(只要元组内的元素也都是不可变类型)等可以作为字典的键。而可变类型如列表、字典等则不能作为键,因为它们的内容可以改变,这将导致哈希值的不一致,从而影响字典的查找效率。

    # 正确的字典键的例子
    my_dict = {"apple": 1,2: "two",(3.0, "tuple"): "tuple key"
    }# 错误的字典键的例子,会引发TypeError
    # my_dict = {
    #     [1, 2, 3]: "list key"  # 这会引发错误,因为列表是可变类型
    # }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸢尾花数据集的KNN探索与乳腺癌决策树洞察

鸢尾花数据集的KNN探索与乳腺癌决策树洞察 今天博主做了这个KNN和决策树的实验。 一.数据集介绍 介绍一下数据集: 威斯康星州乳腺癌数据集: 威斯康星州乳腺癌数据集(Wisconsin Breast Cancer Dataset)是一个经典的机器学习数…

【简单介绍下Beego框架】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

探索 Nacos反序列化漏洞CNVD-2023-45001

在软件开发领域,安全漏洞是一项不容忽视的重要问题。最近,我们的安全团队发现了一个影响到我们的Nacos 2.1.0版本的反序列化漏洞,可能带来严重的安全威胁。我们已经立即采取了修复措施。本文将深入探讨这些漏洞的原理、可能造成的影响&#x…

MySQL数据库-优化慢查询

1、什么是慢查询? 慢查询就是SQL执行时间过长,严重影响用户体验的SQL查询语句。当它频繁出现时数据库的性能和稳定性都会受到威胁 慢查询是数据库性能瓶颈的常见原因,是指SQL执行时间超过阈值;可能由于复杂的连接、缺少索引、不恰…

Linux给磁盘扩容(LVM方式)

Linux给磁盘扩容(LVM方式) 最近测试性能,在本地打数据时,发现磁盘空间不足,于是想手动给/挂载点添加空间。这里介绍通过LVM方式快速给磁盘扩容。 LVM:是一种技术,方便管理磁盘。如果不用LVM,那…

XSS漏洞---类型+实战案例+防止

文章目录 目录 文章目录 一.XSS漏洞简介 二.XSS漏洞类型 三.实战案例 反射型XSS 存储型XSS 四.防护措施 一.XSS漏洞简介 XSS漏洞(Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者在受害者的浏览器中注入恶意脚本。当受…

【python】计算水仙花数

【python】计算水仙花数 "水仙花数"是指一个3位数,它的三个位上的数字的3次幂之和等于它本身。例如,"153"就是一个水仙花数,因为1^3 5^3 3^3 153。以下是一个Python代码示例,用于计算并打印出所有的三位数…

树和森林的遍历

一、树的先根遍历: 先根遍历:若树非空,先访问根结点,再依次对每棵子树进行先根遍历。 //树的先根遍历 void Pre0rder(TreeNode *R){if(R!NULL){visit(R); //访问根节点while(R还有下一个子树T)Pre0rder(T); …

elmentui树形表格使用Sortable拖拽展开行时拖拽bug

1、使用elemntui的el-table使用Sortable进行拖拽,如下 const el this.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, {onEnd: (event) > {const { oldIndex, newIndex } event//拿到更新前后的下标即可完成数据的更新} })2、但是我这…

java中将1.1、3.3、6.6、0.0、0.0等double类型数据相加得到结果精度丢失问题

在项目中需要统计各个商品的价格。出现结果丢失问题。如下 问题代码 Testvoid contextLoads4() throws Exception{double a 3.3;double b 6.6;double c 1.1;double d 0.0;ArrayList<Double> arrayList new ArrayList();arrayList.add(a);arrayList.add(b);array…

【深度学习实战(9)】三种保存和加载模型的方式

一、state_dict方式&#xff08;推荐&#xff09; torch.save(model.state_dict(), PATH)model YourModel() model.load_state_dict(torch.load(PATH)) model.eval()记住一定要使用model.eval()来固定dropout和归一化层&#xff0c;否则每次推理会生成不同的结果。 二、整个…

倾斜摄影修模软件模方(ModelFun)4.1.0下载及安装教程

文章目录 一、模方(ModelFun)4.1.0安装二、模方(ModelFun)4.1.0下载一、模方(ModelFun)4.1.0安装 订阅专栏后(获取专栏内所有文章阅读权限及软件安装包),从文末下载软件模方(ModelFun)4.1.0安装包,如下所示,并开始安装。 1.计算机需要进入测试模式 键盘WIN+R,打开运行窗…

【Tesla T4为例】GPU安装最新版本NVIDIA Driver、CUDA、cuDNN、Anaconda、Pytorch

NVIDIA Driver 进入英伟达官网下载页面 按照以上方式选择即可得到>535.113.01版本的驱动&#xff0c;可以实现多卡推理&#xff0c;小于这个版本会导致多卡训练以及推理报错 虽然最新版本为550.54.15&#xff0c;但是535版本更加稳定&#xff0c;并且pytorch目前只支持到1…

YoutobeDNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 &#xff08;1&#xff09;规模。很多现有的推荐算法在小规模上效果好&#xff0c;但Youtobe规模很大。 &#xff08;2&#xff09;新颖度。Youtobe语料库是动态的&#xff0c;每秒都会有…

javaagent使用

Java Agent是什么&#xff1f; Java Agent是Java平台提供的一个强大工具&#xff0c;它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的&#xff0c;它能够在不影响正常编译的情况下修改字节码&#xff0c;相当于是在main方法执行之前的拦截器&#xff0c;也叫…

【面试经典 150 | 二分查找】在排序数组中查找元素的第一个和最后一个位置

文章目录 写在前面Tag题目来源题目解读方法一&#xff1a;二分查找方法二&#xff1a;使用库函数 知识回顾二分查找的三种写法与三个问题常用的二分库函数 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更……

二叉树的层次遍历(配图详解)

二叉树的层次遍历 层序遍历顾名思义就是一层一层的遍历的树中的所有结点。 typedef char EmpeType 在本篇文章中&#xff0c;将char类型使用EmpeType&#xff1b; typedef char EmpeType;创建一个结构体 typedef struct BiTNode {EmpeType data; //数据域struct BiTNode* …

使用docker配置CCM-SLAM

一.Docker环境配置 1.拉取Docker镜像 sudo docker pull ubuntu:18.04拉取的为ununtu18版本镜像&#xff0c;环境十分干净&#xff0c;可以通过以下命令查看容器列表 sudo docker images 如果想删除多余的docker image&#xff0c;可以使用指令 sudo docker rmi -f <id&g…

“开关是灯的日出日落,日出日落是灯的开关”

C语言刷题 day01 本篇是C语言刷题大杂烩&#xff0c;收集了笔者遇到的认为有价值的题目&#xff0c;本篇会持续更新~~ day01 至少是其他数字两倍的最大数 题目原文&#xff1a; 题意解析&#xff1a; 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 …

符文协议的演变历程:从挑战到创新

在比特币网络长期面临的挑战中&#xff0c;与主流去中心化金融功能的兼容性一直是一大难题。相比之下&#xff0c;以太坊通过ERC-721和ERC-1155代币标准&#xff0c;为NFT和去中心化金融应用提供了支持&#xff0c;而比特币的应用范围却相对有限。然而&#xff0c;近年来&#…