python中的字典(dict)排序

前言

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

生成模拟数据

先安装uuid

pip3 install uuid
# 模拟测试的数据
import random
import uuid

test_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.mfbz.cn/a/557824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题记录2

4.图 4.1.被围绕的区域 思路:图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归,找与边界O联通的O,并标记为#(代表已遍历),最后图中剩下的O就是:被X包围的O。图中所有…

【Linux】进程和计划任务

目录 一、进程介绍 1.1 进程与线程的定义 1.1.1 进程(Process)** 1.1.2 线程(Thread)** 1.1.3 进程与线程的区别 1.2 进程的特征 1.3 进程状态 1.3.1 进程的基本状态 1.3.2 进程更多的状态 1.4 进程的优先级 1.5 进程间通信 1.6 进程的分类* 二、进程管理 2.1 查看…

java核心类

一,String字符串 1.1,String字符串是引用类型,且不可变 String str1 "Hello";String str2 str1.concat(" World"); // 使用concat方法连接字符串,返回一个新的字符串对象System.out.println(str1); // 输出:Hello,原始…

[大模型]InternLM2-7B-chat langchain 接入

InternLM2-7B-chat langchain 接入 InternLM2 ,即书生浦语大模型第二代,开源了面向实用场景的70亿参数基础模型与对话模型 (InternLM2-Chat-7B)。模型具有以下特点: 有效支持20万字超长上下文:模型在20万…

Hadoop3:大数据的基本介绍

一、什么是大数据 1、大数据的4v特点 Volume(大量) Velocity(高速) Variety(多样) Value(低价值密度) 2、大数据部门间的工作岗位 第三部分,其实就是JavaWeb 二、…

使用TomCat写Film前后端项目04.14

使用TomCat写Film前后端项目源文件0414-CSDN博客 实现功能: 得到数据库所有电影数据在首页显示出来 添加 删除 修改 点击修改,获取编号id,传入到根据id编号查询数据的控制器转发数据到 修改的jsp页面。 获取修改数据传入到根据id修改数据的控…

2024 CKA | 基础操作教程(十五)

题目内容 设置配置环境: [candidatenode-1] $ kubectl config use-context xk8s Task 您必须从 master01 主机执行所需的 etcdctl 命令。 首先,为运行在 https://127.0.0.1:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-sn…

【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView(图文并茂超详细版本)

往期回顾 【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)-CSDN博客【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客【QT进阶】Qt Web混合编程之VS2019 C…

【C语言——动态内存管理】

一.为什么要有动态内存分配 通过前面的学习我们已经掌握了使用变量和数组来进行内存的开辟。 上面所说的这两种内存的开辟方式有两个特点: 空间开辟的大小是固定的。数组在生命的时候,必须指定数组的长度,数组空间一旦确定了大小就不能再调整…

逆滤波器的推导与实现

设滤波器为,逆滤波器为 根据滤波器和逆滤波器的定义 对上式做傅里叶变换 对上式做逆傅里叶变换可得, 好了,逆滤波器的公式推导完了,但是实际计算时大多数时候这样是算不出来的,除非像扫频或粉噪这样的全频带信号才行&…

C盘越用越大?教你如何科学管理C盘空间

前言: 如图,左边是我多开的E5电脑,装的是LTSC2019_210707F多开封装版,C盘占用8.5GB,右边是我平常打游戏写代码的电脑,装的是Win11 22H2,C盘占用30GB。两台电脑都关闭了休眠,C盘的虚拟…

logisim 图解超前进位加法器原理解释

鄙人是视频作者,文件在视频简介的网盘链接。 找规律图解超前进位加法器与原理解释_哔哩哔哩_bilibili 一句话就是“把能导致进位到这个位置的情况全都穷举一遍。” 穷举情况看图中算式。 视频讲解比较啰嗦。

LLM padding left or right

参考博客: 大部分的大模型(LLM)采用左填充(left-padding)的原因 注:文章主要内容参考以上博客,及其评论区,如有侵权,联系删除。 最近在看大模型相关内容的时候,突然想到我实习时候一直一知半解的问题&…

经典网络解读—IResNet

论文:Improved Residual Networks for Image and Video Recognition(2020.4) 作者:Ionut Cosmin Duta, Li Liu, Fan Zhu, Ling Shao 链接:https://arxiv.org/abs/2004.04989 代码:https://github.com/iduta…

Ubuntu22.04.4 - 网络配置 - 笔记

一、设置固定ip 1、cd /etc/netplan 查看文件夹下的配置文件 我这里叫 00-installer-config.yaml 2、sudo nano /etc/netplan/00-installer-config.yaml 完成配置后,按下Ctrl O保存更改,然后按下Ctrl X退出nano编辑器。 3、sudo netplan apply 4、ip …

C++ 继承(一)

一、继承的概念 继承是面向对象编程中的一个重要概念,它指的是一个类(子类)可以从另一个类(父类)继承属性和方法。子类继承父类的属性和方法后,可以直接使用这些属性和方法,同时也可以在子类中…

springboot+vue全栈开发【2.前端准备工作篇】

目录 前言准备工作Vue框架介绍MVVM模式 快速入门导入vue在vscode创建一个页面 前言 hi,这个系列是我自学开发的笔记,适合具有一定编程基础(html、css那些基础知识要会!)的同学,有问题及时指正!…

语雀如何显示 Markdown 语法

正常的文章链接 https://www.yuque.com/TesterRoad/t554s28/eds3pfeffefw12x94wu8rwer8o 访问后是文章,无法复制 markdown 的内容 在链接后增加参数 /markdown?plaintrue&linebreakfalse&anchorfalse 直接显示代码

ros2 RVIZ2 不显示urdf模型

ros2 RVIZ2 不显示urdf模型 我的情况是 : 没有如何报错但是不显示 Description Topic 手动写上 /robot_description

python使用tkinter和ttkbootstrap制作UI界面(二)

这次讲解UI界面常用的主键,延续上文的框架进行编写,原界面如下: Combobox组件应用(下拉框) """Combobox组件"""global comvalue_operatorcomvalue_operator tk.StringVar()value_ope…
最新文章