0

0

Python中嵌套字典的自定义排序:将空列表值置于末尾

花韻仙語

花韻仙語

发布时间:2025-10-31 12:49:01

|

525人浏览过

|

来源于php中文网

原创

Python中嵌套字典的自定义排序:将空列表值置于末尾

本文将详细介绍如何在python中对嵌套字典的内部字典进行排序,特别是当需要将空列表作为值的数据项置于排序结果的末尾时。我们将利用`operator.not_`作为排序键,结合`sorted()`函数和字典的`update()`方法,实现高效且灵活的自定义排序逻辑,确保数据结构满足特定业务需求。

在处理复杂的数据结构时,我们经常会遇到需要对嵌套字典中的元素进行排序的场景。一个常见的需求是将特定类型的元素(例如空列表)放置在排序结果的末尾。本教程将以一个具体的学生测试成绩字典为例,详细讲解如何实现这种自定义排序。

原始数据结构

假设我们有一个表示学生信息的字典,其中包含一个名为 "tests" 的内部字典。这个 "tests" 字典的键是测试名称(如 "test1", "test2"),值是包含成绩、等级和时间的列表。某些测试可能还没有数据,因此其值是空列表。

data = {
    "Student Id": {
        "Name": "student name",
        "tests": {
            "test1": ["mark", "grade", "time"],
            "test2": ["mark", "grade", "time"],
            "test3": [],  # 这是一个空列表
            "test4": ["mark", "grade", "time"]
        }
    }
}

我们的目标是对 "tests" 字典进行排序,使得所有非空列表的测试项排在前面,而空列表的测试项(例如 "test3")排在最后。

期望的排序结果

经过排序后,我们期望 "tests" 字典的结构如下(字典在Python 3.7+中保持插入顺序):

立即学习Python免费学习笔记(深入)”;

{
    "Student Id": {
        "Name": "student name",
        "tests": {
            "test1": ["mark", "grade", "time"],
            "test2": ["mark", "grade", "time"],
            "test4": ["mark", "grade", "time"],
            "test3": []  # 空列表被移到了最后
        }
    }
}

核心原理:利用 operator.not_ 进行排序

Python中的布尔值 False 在排序时通常被视为小于 True。在Python中,空列表、空字符串、None、数字 0 等都被认为是“假值”(falsy)。任何非空的列表、非零数字等都被认为是“真值”(truthy)。

operator.not_ 是 not 运算符的函数版本。它的作用是:

Quillbot
Quillbot

一款AI写作润色工具,QuillBot的人工智能改写工具将提高你的写作能力。

下载
  • 如果输入是真值(例如非空列表),not_ 返回 False。
  • 如果输入是假值(例如空列表 []),not_ 返回 True。

因此,当我们使用 key=operator.not_ 对列表进行排序时:

  • 非空列表(真值)会得到一个 False 的排序键。
  • 空列表(假值)会得到一个 True 的排序键。

由于 False 在排序时小于 True,所以非空列表将排在空列表之前,从而实现了将空列表置于末尾的需求。

实现步骤与代码

为了实现上述排序,我们将采取以下步骤:

  1. 获取目标嵌套字典(即 "tests" 字典)。
  2. 使用 sorted() 函数对该字典的值进行排序,排序键设置为 operator.not_。
  3. 将原始字典的键与排序后的值重新组合,并更新原始字典。
from operator import not_

# 原始数据
data = {
    "Student Id": {
        "Name": "student name",
        "tests": {
            "test1": ["mark", "grade", "time"],
            "test2": ["mark", "grade", "time"],
            "test3": [],
            "test4": ["mark", "grade", "time"]
        }
    }
}

# 1. 获取目标字典
tests = data['Student Id']['tests']

# 2. 对字典的值进行排序,空列表置后
# tests.values() 获取所有值
# key=not_ 使得空列表的排序键为True,非空列表为False
sorted_values = sorted(tests.values(), key=not_)

# 3. 将原始字典的键与排序后的值重新组合,并更新原始字典
# zip(tests, sorted_values) 将原始键与排序后的值一一对应
# tests.update(...) 使用新的键值对更新字典,从而改变值的顺序
tests.update(zip(tests, sorted_values))

# 打印排序后的结果
import json
print(json.dumps(data, indent=4))

代码解释:

  • from operator import not_: 导入 not_ 函数。
  • tests = data['Student Id']['tests']: 这一行获取了我们需要排序的 tests 字典的引用。
  • sorted_values = sorted(tests.values(), key=not_): 这是排序的核心。tests.values() 返回一个视图对象,包含字典中所有的值。sorted() 函数对这些值进行排序,key=not_ 指定了排序的依据。如前所述,空列表会被 not_ 映射为 True,非空列表映射为 False,因此排序结果是所有非空列表在前,所有空列表在后。
  • tests.update(zip(tests, sorted_values)): 这一步非常巧妙。
    • tests (在 zip 中作为第一个参数) 提供了原始字典的键("test1", "test2", "test3", "test4"),它们的顺序在Python 3.7+中是保持的。
    • sorted_values 提供了已经排序好的值(["mark", "grade", "time"], ["mark", "grade", "time"], ["mark", "grade", "time"], [])。
    • zip(tests, sorted_values) 将这两个序列打包成一系列的键值对元组:("test1", ["mark", "grade", "time"]), ("test2", ["mark", "grade", "time"]), ("test3", ["mark", "grade", "time"]), ("test4", [])。注意,这里的键仍然是原始的键,但是它们被重新关联到了排序后的值。
    • tests.update(...) 使用这些新的键值对来更新 tests 字典。由于字典在Python 3.7+中保持插入顺序,update() 会根据提供的键值对的顺序来更新或插入元素,从而实现了对字典值的重新排序,同时保持了键的原始语义。

注意事项与总结

  1. Python版本兼容性: 上述方法依赖于Python 3.7+中字典保持插入顺序的特性。如果是在Python 3.6或更早版本中运行,字典的键序可能不会被保留,导致最终结果不确定。
  2. 原地修改: tests.update() 操作会直接修改原始字典 data 中的 "tests" 字典,是原地修改。如果需要保留原始字典,应先进行深拷贝。
  3. 通用性: 这种利用 operator.not_ 进行排序的方法不仅限于空列表,还可以应用于任何布尔值(True/False)、数字 0/非零、空字符串/非空字符串等假值/真值的排序场景。
  4. 自定义更复杂的排序: 如果需要根据列表的长度、特定元素的值等更复杂的条件进行排序,可以将 key 参数设置为一个自定义的 lambda 函数或普通函数,该函数接收字典的值并返回一个用于比较的值。

通过本文的讲解,您应该已经掌握了如何利用 operator.not_ 结合 sorted() 和 update() 方法,对嵌套字典中的值进行灵活排序,尤其是在需要将空列表等假值置于末尾的场景。这种技术在数据清洗、数据展示等多个方面都具有实用价值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

232

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

653

2024.03.22

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号