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

深入理解Python字典(Dictionary):从基础操作到高级应用

深入理解Python字典(Dictionary):从基础操作到高级应用

flyfish

一、Python 字典(Dictionary)基本概念

1. 定义

Python 字典是一种可变、无序的数据结构,用于存储键值对(key - value pairs)。每个键(key)必须是唯一的,且不可变(如字符串、数字或完全不可变的元组),而值(value)可以是任意类型,包括列表、字典等。

2. 特点
  • 键的唯一性:字典中不允许有重复的键,如果尝试使用相同的键进行赋值,后面的值会覆盖前面的值。
  • 无序性:在 Python 3.6 之前,字典是无序的,即键值对的存储顺序和插入顺序无关;从 Python 3.6 开始,字典会保持插入顺序,但这只是一个实现细节,在 Python 3.7 及以后版本才正式成为语言规范。
  • 高效查找:通过键可以快速访问对应的值,平均时间复杂度为 O ( 1 ) O(1) O(1)
3. 用途

字典常用于存储和检索具有关联关系的数据,例如配置信息、数据库记录、统计计数等。

二、使用方法

1. 字典的创建与初始化
  • 使用花括号
# 创建一个空字典
empty_dict = {}
# 创建包含键值对的字典
person = {'name': 'Bob', 'age': 25, 'city': 'New York'}
  • 使用 dict() 构造函数
# 从键值对元组列表创建字典
dict_from_list = dict([('a', 1), ('b', 2)])
# 从关键字参数创建字典
dict_from_kwargs = dict(name='Charlie', age=30)
# 使用 fromkeys 方法创建字典
keys = ('name', 'age', 'city')
new_dict = dict.fromkeys(keys, 'unknown')  # 创建一个字典,所有值初始化为'unknown'
2. 字典的基本操作
  • 访问元素
person = {'name': 'Bob', 'age': 25}
# 使用键访问值
print(person['name'])  # 输出: Bob
# 使用 get() 方法安全访问值
print(person.get('city', 'Unknown'))  # 输出: Unknown
# 使用 setdefault 方法设置默认值
city = person.setdefault('city', 'Unknown')  # 如果'city'键不存在,则设置并返回'Unknown'
  • 添加和修改元素
person = {'name': 'Bob', 'age': 25}
# 添加新的键值对
person['city'] = 'New York'
# 修改已有键的值
person['age'] = 26
  • 删除元素
person = {'name': 'Bob', 'age': 25, 'city': 'New York'}
# 使用 del 语句删除键值对
del person['city']
# 使用 pop() 方法删除键值对并返回值
age = person.pop('age')
# 使用 popitem() 方法随机删除并返回一个键值对
last_item = person.popitem()
3. 字典的常用方法
  • keys()values()items()
person = {'name': 'Bob', 'age': 25}
# 获取所有键
print(person.keys())  # 输出: dict_keys(['name', 'age'])
# 获取所有值
print(person.values())  # 输出: dict_values(['Bob', 25])
# 获取所有键值对
print(person.items())  # 输出: dict_items([('name', 'Bob'), ('age', 25)])
  • update()
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 将 dict2 的键值对更新到 dict1 中
dict1.update(dict2)
print(dict1)  # 输出: {'a': 1, 'b': 3, 'c': 4}
  • clear()
person = {'name': 'Bob', 'age': 25}
# 清空字典
person.clear()
print(person)  # 输出: {}
4. 字典的遍历
  • 遍历键
person = {'name': 'Bob', 'age': 25}
for key in person:print(key)
  • 遍历值
person = {'name': 'Bob', 'age': 25}
for value in person.values():print(value)
  • 遍历键值对
person = {'name': 'Bob', 'age': 25}
for key, value in person.items():print(key, value)
5. 字典的嵌套
students = {'Alice': {'age': 20, 'grades': [85, 90, 78]},'Bob': {'age': 21, 'grades': [70, 80, 85]}
}
print(students['Alice']['grades'])  # 输出: [85, 90, 78]
6. 字典的排序
student_scores = {'Alice': 85, 'Bob': 70, 'Charlie': 90}
# 按键排序
sorted_by_key = sorted(student_scores.items())
# 按值排序
sorted_by_value = sorted(student_scores.items(), key=lambda item: item[1])

三、理论

1. 数据结构基础 - 哈希表

Python 字典是基于哈希表(Hash Table)实现的。哈希表是一种根据键(key)直接访问内存存储位置的数据结构,它通过哈希函数(Hash Function)将键映射到存储桶(Bucket)或槽(Slot)中,以此实现高效的数据存储和查找。

2. 哈希函数

哈希函数是哈希表的核心,它接受一个键作为输入,然后返回一个固定范围的整数,这个整数就是键对应的哈希值(Hash Value)。在 Python 中,内置的 hash() 函数可以计算大多数不可变对象的哈希值。不同的键通过哈希函数计算得到的哈希值可能相同,这种情况称为哈希冲突(Hash Collision)。Python 字典使用开放寻址法(Open Addressing)来解决哈希冲突,即当发生冲突时,会在哈希表中寻找下一个可用的槽位。

3. 字典的存储和查找过程
  • 存储过程
    • 计算哈希值:使用哈希函数计算键的哈希值。
    • 确定槽位:通过哈希值和哈希表的大小,确定键值对应该存储的槽位。
    • 处理冲突:如果该槽位已经被占用(发生哈希冲突),则使用开放寻址法寻找下一个可用的槽位。
    • 存储键值对:将键值对存储到找到的槽位中。
  • 查找过程
    • 计算哈希值:使用相同的哈希函数计算键的哈希值。
    • 确定槽位:根据哈希值和哈希表的大小,找到对应的槽位。
    • 检查键是否匹配:如果该槽位存储的键与查找的键相同,则返回对应的值;如果不相同,则使用开放寻址法继续查找下一个槽位,直到找到匹配的键或遍历完整个哈希表。
4. 动态扩容机制

为了保证哈希表的性能,Python 字典会在必要时进行动态扩容。当哈希表的填充因子(即已使用的槽位数与总槽位数的比值)超过一定阈值(通常是 2/3)时,字典会自动进行扩容操作:

  • 创建新的哈希表:创建一个更大的哈希表,通常是原哈希表大小的两倍。
  • 重新哈希:将原哈希表中的所有键值对重新计算哈希值,并插入到新的哈希表中。此过程可能会导致性能下降,因此选择合适的初始容量以减少扩容次数是很重要的。
5. 键的不可变性要求

Python 字典要求键必须是不可变对象(如字符串、数字、完全不可变的元组),这是因为哈希表的工作原理依赖于键的哈希值的稳定性。如果键是可变对象(如列表、字典),那么在对象状态改变后,其哈希值也会改变,这会导致在查找或删除键值对时出现错误。需要注意的是,即使元组可以用作字典的键,但如果元组内包含可变对象(例如列表),则整个元组也是不可作为字典键的,因为这样的元组不是完全不可变的。

四、完整示例代码

# 创建字典
student = {'name': 'Alice', 'age': 20, 'grades': [85, 90, 78]}# 访问元素
print(student['name'])  # 输出: Alice
print(student.get('city', 'Unknown'))  # 输出: Unknown
city = student.setdefault('city', 'Los Angeles')  # 设置默认城市# 添加和修改元素
student['city'] = 'Los Angeles'
student['age'] = 21# 删除元素
del student['grades']
age = student.pop('age')# 使用常用方法
print(student.keys())  # 输出: dict_keys(['name', 'city'])
print(student.values())  # 输出: dict_values(['Alice', 'Los Angeles'])
print(student.items())  # 输出: dict_items([('name', 'Alice'), ('city', 'Los Angeles')])# 遍历字典
for key, value in student.items():print(key, value)# 字典嵌套
students = {'Alice': {'age': 20, 'grades': [85, 90, 78]},'Bob': {'age': 21, 'grades': [70, 80, 85]}
}
print(students['Alice']['grades'])  # 输出: [85, 90, 78]# 字典排序
student_scores = {'Alice': 85, 'Bob': 70, 'Charlie': 90}
sorted_by_key = sorted(student_scores.items())
sorted_by_value = sorted(student_scores.items(), key=lambda item: item[1])
print(sorted_by_key)
print(sorted_by_value)

五、字典推导式(Dictionary Comprehension)

字典推导式(Dictionary Comprehension)是 Python 中一种简洁、高效的创建字典的方式,它允许你使用一行代码从可迭代对象(如列表、元组、集合等)中创建字典,其语法类似于列表推导式和集合推导式。

基本语法

字典推导式的基本语法结构如下:

{key_expression: value_expression for item in iterable if condition}
  • key_expression:用于生成字典的键的表达式。
  • value_expression:用于生成字典的值的表达式。
  • item:可迭代对象中的每个元素。
  • iterable:可迭代对象,如列表、元组、集合等。
  • if condition:可选的条件表达式,用于筛选符合条件的元素,只有满足条件的元素才会被用于生成字典。
示例及解释
1. 简单的字典推导式

假设你有两个列表,一个存储学生的名字,另一个存储对应的成绩,你可以使用字典推导式将它们组合成一个字典。

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 78]student_scores = {name: score for name, score in zip(names, scores)}
print(student_scores)

解释

  • zip(names, scores)namesscores 列表中的元素一一对应,形成元组。
  • for name, score in zip(names, scores) 遍历这些元组,将每个元组中的第一个元素赋值给 name,第二个元素赋值给 score
  • {name: score}name 为键,score 为值创建字典的键值对。
2. 带有条件的字典推导式

假设你只想将成绩大于 80 分的学生信息存储到字典中,可以添加条件表达式。

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 78]high_score_students = {name: score for name, score in zip(names, scores) if score > 80}
print(high_score_students)

解释

  • if score > 80 是条件表达式,只有当 score 大于 80 时,对应的 namescore 才会被添加到字典中。
3. 使用字典推导式对现有字典进行转换

假设你有一个字典,存储了学生的名字和成绩,你想将成绩转换为对应的等级(A: 90 - 100, B: 80 - 89, C: 70 - 79)。

student_scores = {'Alice': 85, 'Bob': 90, 'Charlie': 78}grade_dict = {name: 'A' if score >= 90 else 'B' if score >= 80 else 'C' for name, score in student_scores.items()}
print(grade_dict)

解释

  • student_scores.items() 返回字典的键值对元组。
  • for name, score in student_scores.items() 遍历这些键值对。
  • 'A' if score >= 90 else 'B' if score >= 80 else 'C' 是一个三元表达式,根据成绩确定对应的等级。

相关文章:

深入理解Python字典(Dictionary):从基础操作到高级应用

深入理解Python字典(Dictionary):从基础操作到高级应用 flyfish 一、Python 字典(Dictionary)基本概念 1. 定义 Python 字典是一种可变、无序的数据结构,用于存储键值对(key - value pairs&…...

@RestController和@RequestBody注解含义

一、RestController (一)含义 RestController 是 Spring Framework 中的一个组合注解,主要用于简化创建 RESTful Web 服务的过程。 它结合了 Controller 和 ResponseBody 注解的功能,使得开发者可以更简洁地编写处理 HTTP 请求的…...

用deepseek学大模型04-模型可视化与数据可视化

deepseek.com: pytorch可视化工具 生成神经网络图 在 PyTorch 中,可视化神经网络结构的常用工具和方法有以下几种,以下将详细介绍它们的用法: 1. TensorBoard (PyTorch 官方集成) PyTorch 通过 torch.utils.tensorboard 支持 TensorBoard&a…...

C++ 设计模式-外观模式

外观模式的定义 外观模式是一种 结构型设计模式,它通过提供一个简化的接口来隐藏系统的复杂性。外观模式的核心思想是: 封装复杂子系统:将多个复杂的子系统或组件封装在一个统一的接口后面。提供简单接口:为客户端提供一个更简单、更易用的接口,而不需要客户端直接与复杂…...

设计模式-结构型-享元模式

1. 享元模式概述 享元模式(Flyweight Pattern)是一种结构型设计模式,主要用于减少对象的数量,以降低内存占用和提高性能。它通过共享相似对象来避免创建大量相同的实例,适用于需要大量创建重复对象的场景,…...

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…...

用deepseek学大模型04-机器学习建模过程

https://metaso.cn/s/7tEmBHr 目前已经学完深度学习的数学基础,给出机器学习建模的基本过程 好的,我现在需要回答用户的问题:已经学完深度学习的数学基础,现在要给出机器学习建模的基本过程。我需要结合我搜索到的资料来构建一个详…...

基于单片机的多功能门铃控制系统设计(论文+源码)

1功能设计 本课题为基于单片机的多功能门铃控制系统设计,主要结合单片机技术,门铃控制技术进行设计,在多功能门铃控制系统的设计中,将其主要的设计功能确定如下: (1)可以实现门铃的基础功能…...

使用Keras构建图像分类模型的入门指南

本人主页:机器学习司猫白 机器学习专栏:机器学习实战 PyTorch入门专栏:PyTorch入门 深度学习实战:深度学习 ok,话不多说,我们进入正题吧 一、Keras框架简介 1.1 什么是Keras? Keras是一个高层神经网络API,最初由Google工程师Franois Chollet开发,具有以下核心特点:…...

docker 运行 芋道微服务

jar包打包命令 mvn clean install package -Dmaven.test.skiptrue创建文件夹 docker-ai 文件夹下放入需要jar包的文件夹及 docker-compose.yml 文件 docker-compose.yml 内容:我这里的是ai服务,所以将原先的文件内容做了变更,你们需要用到什…...

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘,以及后续的模型数据下载也在C盘,导致会占用C盘空间,所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…...

整合Salesmart/WhatsApp、开源Odoo模块和Deepseek AI能力,实现针对国外客户的智能客服和个性化推荐服务

一、项目背景 本文提出了一套针对软管制造公司的智能客服与个性化推荐系统实施方案,旨在通过整合开源Odoo模块、Salesmart/WhatsApp以及Deepseek AI能力,打造一个724小时不间断服务的智能化平台,专注于服务国外客户。方案围绕实现不间断服务…...

人工智能基础之数学基础:01高等数学基础

函数 极限 按照一定次数排列的一列数:“,“,…,"…,其中u 叫做通项。 对于数列{Un}如果当n无限增大时,其通项无限接近于一个常数A,则称该数列以A为极限或称数列收敛于A,否则称数列为发散, 极限值 左…...

sourcetree gitee 详细使用

SSH 公钥设置 | Gitee 帮助中心 先配置公钥,输入gitee密码完成验证 gitee仓库创建完成 打开sourcetree 如果你本地有项目(vite )需要 git init 在设置中完成远程仓库的添加 (ssh ,https) 直接提交推送,完成后&#xf…...

应急响应(linux 篇,以centos 7为例)

一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录:lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志:…...

【Scrapy】Scrapy教程5——第一个Scrapy项目

文章目录 Scrapy目录结构第一个爬虫运行爬虫必要说明start_requests()和start_urls如何关闭allowed_domains的限制通过前几节的学习,我们已经了解了Scrapy的基本操作,下面我们开始第一个项目,我以本人的 网址为例进行爬虫讲解,之所以用我自己的网站,是因为我这个网站本来…...

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作(Ollama 工具介绍与下载)2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...

网络基础 【UDP、TCP】

1.UDP 首先我们学习UDP和TCP协议 要从这三个问题入手 1.报头和有效载荷如何分离、有效载荷如何交付给上一层的协议?2.认识报头3.学习该协议周边的问题 UDP报头 UDP我们先从示意图来讲解,认识报头。 UDP协议首部有16位源端口号,16位目的端…...

SQL知识体系

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫结构化查询语言。 SQL92和SQL99有什么区别呢? SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用(&#xff…...

深入浅出:CUDA是什么,如何利用它进行高效并行计算

在当今这个数据驱动的时代,计算能力的需求日益增加,特别是在深度学习、科学计算和图像处理等领域。为了满足这些需求,NVIDIA推出了CUDA(Compute Unified Device Architecture),这是一种并行计算平台和编程模…...

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑩】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10 作者:车端域控测试工程师 更新日期:2025年02月18日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-010测试用例 用例ID测试场景验证要点参考条款预期结果TC…...

大语言模型入门

大语言模型入门 1 大语言模型步骤1.1 pre-training 预训练1.1.1 从网上爬数据1.1.2 tokenization1.1.2.1 tokenization using byte pair encoding 1.3 预训练1.3.1 context1.3.2 training1.3.3 输出 1.2 post-training1:SFT监督微调1.2.1 token 1.3 强化学习1.3.1 基…...

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白,谈谈零基础如何入门网络安全,有不对的地方,请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别…...

【Go | 从0实现简单分布式缓存】-2:HTTP服务端与一致性哈希

本文目录 一、回顾1.1 复习接口 二、http标准库三、实现HTTP服务端四、一致性哈希 本文为极客兔兔“动手写分布式缓存GeeCache”学习笔记。 一、回顾 昨天已经开发了一部分项目,我们先来看看项目结构。 分布式缓存需要实现节点间通信,建立基于 HTTP 的…...

分享一个使用的音频裁剪chrome扩展-Ringtone Maker

一、插件简介 铃声制作器是一个简单易用的 Chrome 扩展,专门用于制作手机铃声。它支持裁剪音频文件的特定片段,并将其下载为 WAV 格式,方便我们在手机上使用。无论是想从一段长音频中截取精彩部分作为铃声,还是对现有的音频进行个…...

知识拓展:设计模式之装饰器模式

装饰器模式拓展 1. 什么是装饰器模式? 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原始类,从而在不修…...

服务器A到服务器B免密登录

#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...

【kafka系列】At Most Once语义

目录 1. At-Most-Once语义的定义 2. Kafka实现At-Most-Once的机制 2.1 生产者端 2.2 消费者端 3. At-Most-Once示例 场景描述 3.1 生产者代码(可能丢失消息) 3.2 消费者代码(可能丢失消息) 4. 典型消息丢失场景分析 场景…...

ESP学习-1(MicroPython VSCode开发环境搭建)

下载ESP8266固件:https://micropython.org/download/ESP8266_GENERIC/win电脑:pip install esptools python.exe -m pip install --upgrade pip esptooo.py --port COM5 erase_flash //清除之前的固件 esptool --port COM5 --baud 115200 write_fla…...

CAS单点登录(第7版)10.多因素身份验证

如有疑问,请看视频:CAS单点登录(第7版) 多因素身份验证 概述 多因素身份验证 (MFA) 多因素身份验证(Multifactor Authentication MFA)是一种安全机制,要求用户提供两种…...