当前位置: 首页 > article >正文

Python中的字典:深度解析与应用实践

一、字典的本质与特性

Python字典(Dictionary)是以**键值对(Key-Value Pair)**形式存储数据的无序集合,使用大括号{}定义。其核心特性包括:

  • 快速查找:基于哈希表实现,通过键(Key)可在O(1)时间复杂度内访问值(Value)。
  • 动态可变:支持增删改操作,键值对数量可动态变化。
  • 键唯一性:每个键必须是唯一的且不可变类型(如字符串、数字、元组),值可为任意数据类型。
  • 无序性:Python 3.7前字典无序,3.7+版本保留插入顺序,但本质仍以哈希机制为核心。

二、字典的创建与初始化
  1. 直接赋值
    通过大括号定义键值对:

    user = {"name": "Alice", "age": 30, "is_student": False}  # 字符串键与混合值
    config = {1: "启用", 0: "禁用"}  # 整数键
    
  2. 空字典与类型转换

    empty_dict = {}  # 空字典
    from_list = dict([("a", 1), ("b", 2)])  # 列表转字典 → {'a':1, 'b':2}
    
  3. 使用字典推导式
    快速生成字典的简洁语法:

    squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, 2:4, 3:9, 4:16}
    filtered = {k: v for k, v in user.items() if isinstance(v, str)}  # 筛选字符串值
    

三、字典的访问与操作
  1. 基本操作

    • 获取值
      print(user["name"])  # Alice(键存在时)
      print(user.get("height", 170))  # 若键不存在返回默认值170
      
    • 添加/修改值
      user["email"] = "alice@example.com"  # 新增键值对
      user["age"] = 31  # 修改现有键的值
      
    • 删除键值对
      del user["is_student"]  # 删除指定键
      email = user.pop("email")  # 删除并返回键对应的值
      
  2. 批量操作

    • 合并字典:
      info = {"city": "北京", "job": "工程师"}
      user.update(info)  # 合并到user字典
      
    • 清空字典:
      user.clear()  # 清空所有键值对 → {}
      
  3. 视图对象
    通过keys()values()items()获取动态视图:

    keys = user.keys()     # 键视图(dict_keys类型)
    values = user.values() # 值视图(dict_values类型)
    pairs = user.items()   # 键值对视图(dict_items类型)
    

四、高级操作与技巧
  1. 嵌套字典
    字典的值可以是另一个字典,构建复杂数据结构:

    company = {"name": "DeepSeek","departments": {"研发部": {"人数": 50, "预算": 1000000},"市场部": {"人数": 20, "预算": 500000}}
    }
    # 访问嵌套值
    print(company["departments"]["研发部"]["预算"])  # 1000000
    
  2. 默认值处理

    • setdefault():自动初始化缺失键的默认值:
      data = {}
      data.setdefault("scores", []).append(90)  # 自动创建空列表
      
    • collections.defaultdict:预定义默认值类型:
      from collections import defaultdict
      counter = defaultdict(int)  # 缺失键默认值为0
      counter["apple"] += 1  # {'apple':1}
      
  3. 字典与JSON互转
    结合json模块实现序列化与反序列化:

    import json
    user_json = json.dumps(user)  # 字典转JSON字符串
    user_dict = json.loads(user_json)  # JSON字符串转字典
    

五、性能分析与应用场景
  1. 性能优势

    • 查找速度:哈希表机制确保快速访问,远超列表遍历。
    • 内存开销:因存储键值元数据,内存占用略高于列表,但可通过__slots__优化。
  2. 典型应用场景

    • 配置管理:存储程序参数(如数据库连接信息)。
    • 数据聚合:统计词频、用户行为分析。
    • 缓存系统:以键快速存取计算结果。
    • API交互:处理JSON格式的请求与响应。

六、注意事项与最佳实践
  1. 键的设计原则

    • 使用不可变类型(如字符串、元组)作为键。
    • 避免使用复杂对象(如列表)作为键。
  2. 避免哈希冲突
    自定义对象作为键时,需正确实现__hash__()__eq__()方法。

  3. 内存优化

    • 对于大规模数据,考虑使用sys.getsizeof()监控内存。
    • 使用生成器替代存储完整字典,减少内存消耗。
  4. 替代方案

    • collections.OrderedDict:需严格维护插入顺序时使用。
    • dataclasses:Python 3.7+中替代简单字典的结构化数据类。

Python字典作为核心数据结构,以其高效性和灵活性成为数据处理的首选工具。通过掌握其核心操作与高级技巧,开发者能够高效实现数据建模、快速查询及复杂业务逻辑,为机器学习、Web开发、自动化脚本等场景提供强大支持。

相关文章:

Python中的字典:深度解析与应用实践

一、字典的本质与特性 Python字典(Dictionary)是以**键值对(Key-Value Pair)**形式存储数据的无序集合,使用大括号{}定义。其核心特性包括: 快速查找:基于哈希表实现,通过键&#…...

1. 环境准备

安装CentOS 7 配置网络 默认网络是NAT 端口转发 更改/etc/sysconfig/network-scripts/ifcfg-ens33 修改以下内容: BOOTPROTOstatic 启用静态IP地址 ONBOOTyes 开启自动启用网络连接 添加以下内容: IPADDR192.168.30.100 设置IP地址 NETMASK255.25…...

【链表】一文搞定链表算法:从基础到实战

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言例题一、两数相加二、两两交换链表中的节点三、重排链表四、合并K个升序链表五、 K个⼀组翻转链表 结语 前言 什么是链表算法: 链表算法&#xff0…...

瑞萨RA系列使用JLink RTT Viewer输出调试信息

引言 还在用UART调试程序么?试试JLINK的RTT Viewer吧!不需占用UART端口、低资源暂用、实时性高延时微秒级,这么好的工具还有什么理由不用了! 目录 一、JLink RTT Viewer 简介 二、软件安装 三、工程应用 3.1 SEGGER_RTT驱动包 3.2 手搓宏定义APP_PRINT 3.3 使用APP_…...

DEFI币生态重构加速,XBIT去中心化交易所引领DEX安全新范式

2025年3月18日,全球加密市场在监管与技术共振下迎来结构性变革。去中心化金融(DeFi)代币DEFI币因跨链流动性协议升级引发社区热议,而币应XBIT去中心化交易所(以下简称XBIT)凭借其链上透明验证机制、无需下载…...

高性能缓存:使用 Redis 和本地内存缓存实战示例

在现代高并发系统中,缓存技术是提升性能和降低数据库压力的关键手段。无论是分布式系统中的Redis缓存,还是本地高效的本地内存缓存,合理使用都能让你的应用如虎添翼。今天,我们将基于go-dev-frame/sponge/pkg/cache库的代码示例&a…...

Linux动态库和静态库

Linux动态库和静态库 Linux动态库和静态库动静态库的基本原理可执行程序的生成过程动静态库的本质 认识动静态库背后的库支持动静态库的命名静态链接示例 动静态库各自的特征静态库动态库 静态库的打包与使用示例文件打包1. 生成目标文件2. 打包静态库3. 组织文件使用 Makefile…...

13 IO流:字节流、字符流、缓冲流、文件复制(字节/字符/缓冲区)、字符转换流、打印流、IO框架(黑马Java视频笔记)

文章目录 IO流 >> 读写数据的方案1. 认识IO流1)IO流的分类2)IO流的体系 2. 文件字节输入流2.1 创建文件字节流对象2.2 读取文件1)使用read()方法一个一个字节的读取2)使用字节数组读取数据:byte[]3)使用字节流读…...

深入理解 TypeScript 中的迭代器(Iterators)与生成器(Generators)

一、为什么需要迭代协议? 在现代 JavaScript/TypeScript 开发中,我们经常需要处理各种集合型数据:数组、Map、Set 甚至是自定义数据结构。ES6 引入的迭代协议(Iteration Protocols)正是为了解决统一遍历机制的问题。通…...

靶场(十四)---小白心得思路分享---Extplorer

启程: 开始扫描端口服务,发现什么都没有,果断进行下一步目录扫描 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 98:4e:5d:e1:e6:97:29:6f:…...

逆向中常见的加密算法识别

1、base64及换表 base64主要是将输入的每3字节(共24bit)按照每六比特分成一组,变成4个小于64的索引值,然后通过一个索引表得到4个可见的字符。 索引表为一个64字节的字符串,如果在代码中发现引用了这个索引表“ABCDEF…...

【初学者】怎样学习、使用与研究算法?

李升伟 整理 学习、使用与研究算法是一个系统化的过程,涉及理论学习、实践应用和深入研究。以下从学习方法、使用技巧和研究方向三个方面进行详细阐述: 一、学习方法 1. 分阶段学习 初级阶段:掌握经典算法,如最短路径算法&…...

【愚公系列】《高效使用DeepSeek》018-错题本整理

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

Linux上的`i2c-tools`工具集的编译构建和安装

源码复制到Ubuntu系统中并解压 的i2c-tools工具集的源码百度网盘下载链接: https://pan.baidu.com/s/1XNuMuT1auT1dMzYo3LAFmw?pwdi6xe 终端进入源码目录 cd /home/book/mybuild/i2c-tools-4.2执行编译构建命令 运行下面的命令进行编译构建 make CC${CROSS_COM…...

langgraph简单Demo(使用langserve实现外部调用)

前言 这个示例是研究如何使用langserve实现外部调用 接入大模型参考文章:接入阿里云百炼 1、安装依赖 pip install langserve fastapi uvicorn pip install sse_starlette 2、代码实现 from fastapi import FastAPI from langchain_core.messages import HumanM…...

【C#高阶编程】—单例模式详解

C# 单例模式 单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式常用于需要全局唯一对象的场景,比如配置文件管理、日志记录、数据库连接池等。 单例模式的核心特点 私有构造函数:…...

折叠树报表

折叠树报表中包含了三种信息: 1.树组织信息-可展开、收拢 2.节点的统计信息(汇总求和) 3.每个节点对应的数据信息 一、准备数据 mysql8 数据库中存在两张表 org和store表。 org表和部分数据如下,其中orgname是组织的名称,codepath是完整的组织代码,seq是每个节点的顺序,可…...

Python个人学习笔记(16):模块(os)

四、os模块 主要用于文件夹处理 (一)文件夹相关 os.makedirs(‘dirname1/dirname2’) :创建文件夹目录,不能重复创建,用的多 代码: os.makedirs(a/b/c)结果: os.removedirs(‘dirname1’)&…...

虚拟地址空间(下)进程地址空间(上)

一.关于页表组成 1.权限(rwx) 作用:如1.让代码区变成只读的 2.写时拷贝的实现:子进程创建时其页表指向的父进程代码和数据权限都是只读的,子进程试图修改,触发错误,系统开始写时拷贝。 来源:…...

【数据集分享】青藏高原两次强震玛多地震和漾濞地震的震源过程

2021年5月21日,5小时内在青藏高原不同区域发生了漾濞6.4级和玛多7.4级强烈地震,表明印度板块和欧亚大陆板块的碰撞汇聚作用下青藏高原持续和频繁的 剧烈构造运动和地震活动。本研究利用地震记录和空间对地观测同震位移资料(InSAR)…...

jmeter环境搭建及使用

Meter 是一个开源的性能测试工具,用于测试静态和动态资源的性能。 1、安装 官网下载: 下载地址:Apache JMeter - Download Apache JMeter 网盘下载: 通过百度网盘分享的文件:apache-jmeter-5.6.3.rar 链接&#x…...

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...

网络编程--服务器双客户端聊天

写一个服务器和客户端 运行服务器和2个客户端,实现聊天功能 客户端1和客户端2进行聊天,客户端1将聊天数据发送给服务器,服务器将聊天数据转发给客户端2 要求: 服务器使用 select 模型实现 ,客户端1使用 poll 模型实现…...

yum软件包乾坤大挪移(Yum Package Qiankun Great Migration)

yum软件包乾坤大挪移 背景 由于很多的生产环境是无法连接外网的,因此用yum或者dnf命令来安装软件包常常是一个比较麻烦的事情,原因是很多软件的依赖很复杂,如果要一个个下载、拷贝、再安装,这往往是一个非常繁琐冗杂的过程&…...

Java:读取中文,read方法

public static void main(String[] args) throws IOException {FileReader fr new FileReader("C:\\aaa\\a.txt");//字符流的底层也是一个字节一个字节读取的,遇到中文就一次读多个,GBK一次读两个,UTF-8一次读三个字节//idea默认U…...

[GHCTF 2025]真会布置栈吗?

题目是一个聊天室,我们先按照题目使用 /help Help: /help 显示此帮助信息 /msg [text] 在当前频道发送消息 /nick [name] 更改你的用户名 /list 列出可用的频道 /join [channel] 切换到不同的频道 /channel …...

集合的练习1-2

//练习1&#xff1a; import java.util.ArrayList;public class ArraylistTest1 {public static void main(String[] args){ArrayList<String> listnew ArrayList<>();//需求&#xff1a;定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历//遍历格式&…...

英语词性--数词

文章目录 数词概念数词分词基数词序数词 基数与序数词的区别基变序的规律 数词概念 数词&#xff08;Numerals&#xff09; 是英语中用于表示 数量&#xff08;基数&#xff09;或顺序&#xff08;序数&#xff09; 的词类&#xff0c;通常用于描述数字、计数、顺序等。 例如&…...

面试整理--一个报告生成的方案解析

最近又快到了年后找工作的时间&#xff0c;近期写点工作积累&#xff0c;供大家参考。 欢迎关注公主号【测试开发备忘录】&#xff0c;交流职场技巧和经验 首先从工作中一个报错来展开: Start directory is not importable: 错误信息 "Start directory is not importable…...

C#零基础入门篇(18. 文件操作指南)

## 一、文件操作基础 在C#中&#xff0c;文件操作主要通过System.IO命名空间中的类来实现&#xff0c;例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### &#xff08;一&#xff09;文件读取 1. **使用File.ReadAllText方法读取文件内容为字符串** …...