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

15 python 数据容器-字典

在 Python 的编程世界里,字典是一种超实用的数据类型,它就像打工人的工作资料夹,能把各种不同类型的信息有条理地存起来,还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说,掌握字典的用法,能让你在处理数据时更加得心应手。

一、字典的定义

为什么叫字典,我们先看看生活种的字典长啥样

在生活种的字典里,都是一个个字,后边跟着它的含义,同样的,在python里的字典就是一个个key对应value,也称为键值对

为什么需要到字典这种数据容器,比如说,公司里的牛马,叫张三、翠花、mary的,他们都有绩效,就需要到键值对,名字就是key,绩效就是value。

字典是一种可变容器模型,可以存储任意类型的对象。它由一个个键值对(key=>value)组成,每个键值对之间用逗号分隔,键和值之间用冒号分隔,整个字典用花括号 {} 括起来

定义一个字典:

变量名 = {key:value, key:value, key:value, ... , key:value}

定义一个空字典:

变量名 = {}

变量名 = dict()

注意:我们前面提到的集合和字典都是用大括号,提到集合不能直接使用{}的方式定义空集合,因为这个功能给字典使用了

比如,记录一位员工的基本信息:

employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info)
# {'name': '小李', 'age': 25, 'position': '程序员'}

 这里的 'name' 'age' 'position' 就是键,'小李' 25 '程序员' 就是对应的值。

需要注意的是,字典的键必须是唯一的,但值可以重复;而且键必须是不可变的数据类型,像字符串、数字、元组就可以当键,列表就不行。

创建空字典也很简单,有两种方法:

  • 使用大括号 {} :
    empty_dict1 = {}
    print(empty_dict1) 
    # {}
  • 使用内建函数 dict() :
    empty_dict2 = dict()
    print(empty_dict2)  
    # {}

二、访问字典里的值

想要查看员工的年龄,只要把对应的键 'age' 放到方括号里,就像在资料夹里找特定文件一样,如下所示:

employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info['age'])  # 25

不过,如果用字典里没有的键去访问数据,就会报错,就像在资料夹里找一份不存在的文件,肯定找不到呀:

employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info['salary'])  
# KeyError: 'salary'

 运行这段代码,会看到报错信息,提示找不到 'salary' 这个键。

三、修改字典

在员工信息管理过程中,员工的信息可能会发生变化,比如小李升职了,这时候就需要修改字典里的数据。向字典添加新内容或者修改已有内容,都是通过增加或改变键值对来实现的。例如:

employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
employee_info['age'] = 26  # 小李过生日,年龄加1
employee_info['department'] = '技术部'  # 增加部门信息
print(employee_info)
# {'name': '小李', 'age': 26, 'position': '程序员', 'department': '技术部'}

四、删除字典元素

如果有员工离职了,就需要从字典里删除相应的信息。可以删除单一的键值对,也能清空整个字典。

  • 删除单一元素,用 del 命令:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    del employee_info['position']  # 删除职位信息
    print(employee_info)  
    # {'name': '小李', 'age': 25}
  • 清空字典,使用 clear() 方法:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    employee_info.clear()  # 清空字典
    print(employee_info)
    # {}
  • 删除整个字典,也是用 del 命令:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    del employee_info  # 删除字典
    print(employee_info)  
    # NameError: name 'employee_info' is not defined

    执行最后一行代码会报错,因为字典已经被删除,不存在了。同时,IDE里也会出现黄色警告的

五、字典键的特性

  • 键的唯一性:字典里不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会覆盖前一个值。例如:同时,IDE里也会出现黄色警告的
    employee_info = {'name': '小李', 'name': '李华'}
    print(employee_info['name'])  
    # 李华
  • 键的不可变性:键必须是不可变的,所以可以用数字、字符串或元组充当键,但列表不行。例如:
    employee_info = {['name']: '小李', 'age': 25}  
    # TypeError: unhashable type: 'list'

    运行这段代码会报错,因为列表是可变的,不能作为字典的键。

六、字典内置函数和方法

Python 为字典提供了很多内置函数和方法,方便我们操作字典。

6.1 内置函数

  • len(dict):计算字典元素个数,也就是键的总数。比如统计员工信息字典里有多少条信息:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    print(len(employee_info))  # 3
  • str(dict):把字典转换成可以打印的字符串形式,方便查看字典内容,比如显示到界面上:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    print(str(employee_info))
    # {'name': '小李', 'age': 25, 'position': '程序员'}

6.2 内置方法

  • dict.clear():删除字典内所有元素,前面已经介绍过啦。
  • dict.copy():返回一个字典的浅复制。比如你想备份一份员工信息字典:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    backup_info = employee_info.copy()
    print(backup_info)  
    # {'name': '小李', 'age': 25, 'position': '程序员'}
  • dict.fromkeys():创建一个新字典,用序列中的元素作为字典的键,val 为所有键对应的初始值。假设公司新来了一批员工,职位都一样,可以这样创建字典:
    new_employees = ['小张', '小王', '小赵']
    new_employee_dict = dict.fromkeys(new_employees, '实习生')
    print(new_employee_dict)  
    # {'小张': '实习生', '小王': '实习生', '小赵': '实习生'}
  • dict.get(key, default=None):返回指定键的值,如果键不在字典中,就返回设置的默认值。比如查看员工的薪资,如果没有薪资信息,就返回默认值 0:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    salary = employee_info.get('salary', 0)
    print(salary)  # 0
  • key in dict:判断键是否在字典里,如果在返回 True ,否则返回 False 。比如判断员工字典里有没有 'age' 这个键:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    print('age' in employee_info)  # True
  • dict.items():以列表形式返回一个视图对象,包含字典的所有键值对。遍历员工信息字典,打印每个键值对:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    for key, value in employee_info.items():print(f"{key}: {value}")
    # name: 小李
    # age: 25
    # position: 程序员
  • dict.keys():返回一个视图对象,包含字典的所有键。获取员工信息字典里所有的键:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    keys = employee_info.keys()
    print(keys)  
    # dict_keys(['name', 'age', 'position'])

    在 Python3.x 中,dict.keys() 返回的是 dict_keys 对象,如果需要转换成列表,可以使用 list(dict.keys()) 。

    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    keys = employee_info.keys()
    keys_list = list(keys)
    print(keys)
    print(keys_list)
    # dict_keys(['name', 'age', 'position'])
    # ['name', 'age', 'position']
  • dict.setdefault(key, default=None):和 get() 类似,但如果键不存在于字典中,会添加键并将值设为默认值。比如获取员工的部门信息,如果没有部门信息,就添加并设为 '未分配' :
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    department = employee_info.setdefault('department', '未分配')
    print(department)
    print(employee_info)  
    # 未分配
    # {'name': '小李', 'age': 25, 'position': '程序员', 'department': '未分配'}
  • dict.update(dict2):把另一个字典的键值对更新到当前字典里。假设又获取了一些员工的其他信息,要更新到原来的字典里:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    extra_info = {'salary': 5000, 'department': '技术部'}
    employee_info.update(extra_info)
    print(employee_info)  
    # {'name': '小李', 'age': 25, 'position': '程序员', 'salary': 5000, 'department': '技术部'}
  • dict.values():返回一个视图对象,包含字典的所有值。获取员工信息字典里所有的值:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    values = employee_info.values()
    print(values)  
    # dict_values(['小李', 25, '程序员'])

    在 Python3.x 中,dict.values() 返回的是 dict_values 对象,如果需要转换成列表,可以使用 list(dict.values()) 。

    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    values = employee_info.values()
    print(values)
    values_list = list(values)
    print(values_list)
    # dict_values(['小李', 25, '程序员'])
    # ['小李', 25, '程序员']
  • pop(key[,default]):删除字典中指定键所对应的值,返回被删除的值。比如员工离职,删除其信息并返回职位信息:
    employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
    position = employee_info.pop('position')
    print(position)
    print(employee_info)  
    # 程序员
    # {'name': '小李', 'age': 25}

七、字典的其他应用场景

7.1 字典嵌套

字典可以支持无限极嵌套。比如记录公司不同城市的办公地点及对应的部门信息:

company_offices = {'北京': {'研发部': ['朝阳区', '海淀区'],'市场部': ['东城区']},'上海': {'研发部': ['浦东新区'],'销售部': ['徐汇区', '闵行区']}
}
print(company_offices['北京']['研发部'])  
# ['朝阳区', '海淀区']

这样就能通过层层索引,获取具体的信息,比如查看北京研发部的办公地点

7.2 字典推导式

和列表推导式类似,字典也有推导式,能更简洁地创建字典。格式是 {key:value for variable in iterable [if expression]} 。比如创建一个字典,键是 1 到 5 的数字,值是数字的平方:

square_dict = {num: num ** 2 for num in range(1, 6)}
print(square_dict)
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

7.3 字典实现分支需求

在编程中,有时候需要根据不同的条件执行不同的操作,用字典可以很方便地实现。比如根据 HTTP 状态码返回不同的提示信息:

def status(code):status_dict = {400: "Bad request",404: "Not found"}return status_dict.get(code, "Unknown status code")
print(status(400))
print(status(404))
print(status(200))  
# Bad request
# Not found
# Unknown status code

相关文章:

15 python 数据容器-字典

在 Python 的编程世界里,字典是一种超实用的数据类型,它就像打工人的工作资料夹,能把各种不同类型的信息有条理地存起来,还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说,掌握字典的用法,能让你…...

Linux的一些常见指令

一、ls指令 语法: ls (选项) 功能: ls可以查看当前目录下的所有文件和目录。 常用选项: -a:列出目录下的所有文件,包括以点(.)开头的隐含文件 。-d:将目录像文件一样显示,不显示其下的文件。…...

Pre-flash和Main flash

在相机拍照过程中,Pre-flash(预闪光) 和 Main flash(主闪光) 是常见的两种闪光灯使用模式,通常用于提高低光环境下的拍摄质量,尤其在自动曝光(AE)和自动对焦(…...

jmm-java内存模型

java内存模型----底层原理 底层原理 从Java代码到最终执行的CPU指令的流程: 最开始,我们编写的Java代码,是*.java文件在编译(javac命令)后,从刚才的*.java文件会变出一个新的Java字节码文件(…...

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录,使用合宙erp账号登录即可 点击右上角构建,点击右上角菜单新构建,自定义构建名称,可新建多个 勾选想要的组件 点击右上角保存修改,只有点击准备就绪(注意:一定…...

解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题

一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...

好用的Markdown阅读编辑器Typora破解记录

Typora破解 一、下载Typora二、安装Typora三、破解Typora 😀 记录一下Typora破解记录,怕不常用忘记咯,感觉自己现在的脑子就像我的肠子一样,刚装进去就么得了。。。😔 Typroa算是用起来很舒服的Markdown阅读器了吧&am…...

c#在work线程中怎样更新UI控件

最近笔者调试修改项目,碰到了c#在work线程中怎样更新UI控件中的场景,简单总结了下,主要有两个方法: 方法1:通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…...

RabbitMQ三种队列深度解析:区别、场景与未来趋势

嗯,用户让我分析RabbitMQ三种队列的区别、应用场景、技术原理和未来趋势,还要写一篇三千字的文章。首先,我需要回顾一下搜索结果,看看有哪些资料可用。 根据搜索结果,RabbitMQ的三种队列是经典队列(Classi…...

自然语言处理(13:RNN的实现)

系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...

WebSocket接入SSL证书

目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时,使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性,还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…...

无人机宽带自组网机载电台技术详解,50KM超远图数传输系统实现详解

以下是关于无人机宽带自组网机载电台技术以及50KM超远图数传输系统实现的详解: 无人机宽带自组网机载电台技术详解 无人机宽带自组网机载电台是一种专门为无人机设计的通信设备,它支持宽带数据传输和自组网功能。这种电台的实现技术涉及多个方面&#x…...

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…...

Spring Boot定时任务设置与实现

Spring Boot定时任务设置与实现 在Spring Boot中&#xff0c;可以使用Scheduled注解来创建定时任务。以下是一个简单的示例&#xff0c;展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先&#xff0c;确保你的pom.xml文件中包含Spring Boot的依赖&#xff…...

#vue中解决异步请求的竞态

// composables/useFetchWithoutRace.js import { ref } from vue; import axios from axios;// 定义一个可复用的 Composition 函数&#xff0c;处理带有竞态控制的异步请求 export function useFetchWithoutRace() {// 定义响应式变量 latestRequestId&#xff0c;用于追踪最…...

BP神经网络+NSGAII算法(保真)

BP神经网络NSGAII算法 非常适合用来当作实验验证自己的结论&#xff0c;构建一个神经网络模型&#xff0c;并使用NSGAII多目标优化算法来实现多领域的毕业论文的设计。仅仅使用简单的matlab代码就可以实现自己的多目标优化任务。 BP神经网络算法 我的任务是预测三个变量的值…...

【CXX-Qt】4.1 extern “RustQt“

QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心&#xff0c;用于声明 Rust 类型和签名&#xff0c;使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...

每日一题-力扣-2829. k-avoiding 数组的最小总和 0326

解决"k-avoiding 数组的最小总和"问题 这道题有两种主要解法。 解法一&#xff1a;直接数学计算&#xff08;最优解&#xff09; 通过数学推导直接计算出结果&#xff0c;不需要构建实际的数组。 class Solution:def minimumSum(self, n: int, k: int) -> int…...

React 中的错误边界(Error Boundaries),如何使用它们捕获组件错误

大白话React 中的错误边界&#xff08;Error Boundaries&#xff09;&#xff0c;如何使用它们捕获组件错误 在 React 里&#xff0c;错误边界就像是一个“小卫士”&#xff0c;专门负责在组件出现错误时挺身而出&#xff0c;避免整个应用因为一个小错误就崩溃掉。接下来我会详…...

OSI模型_TCP/IP模型_五层模型

文章目录 OSI模型_TCP/IP模型_五层模型模型对比模型层级对比关键区别对比 OSI模型OSI模型概述举例说明流程图示 TCP/IP 四层模型模型结构举例说明流程图示 TCP/IP 五层模型模型的结构举例说明流程图示 OSI模型_TCP/IP模型_五层模型 学OSI&#xff0c;用TCP/IP&#xff0c;分析选…...

HarmonyOS Next应用架构设计与模块化开发详解

引言 在HarmonyOS Next开发中&#xff0c;合理的应用架构设计和模块化开发是构建高效、可维护应用的关键。本文将深入探讨HarmonyOS Next应用的架构设计思路&#xff0c;并通过实际代码示例展示如何实现模块化开发。 应用架构设计 HarmonyOS Next应用通常采用分层架构设计&…...

SpringCould微服务架构之Docker(2)

Docker和虚拟机的差别&#xff1a; 虚拟机是在操作系统中模拟硬件设备&#xff0c;然后运行另外一个操作系统。...

LINUX基础IO [六] - 文件理解与操作

目录 前言 C语言文件操作回顾 文件的打开与关闭 文件的增删改查 文件系统调用 比特位方式的标志位传递原理 访问文件的本质 文件描述符fd 理解文件描述符fd 三个流的理解 文件描述符的分配规则 重定向再理解 输出重定向 输入重定向 如何理解一切皆文件 理解…...

拥抱人工智能大模型时代:大模型会改变我们的生活吗?

在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活和工作方式。尤其是随着人工智能大模型&#xff08;如ChatGPT、DeepSeek等&#xff09;的崛起&#xff0c;人们对于AI技术的期待和关注达到了前所未有的高度。那么&…...

常见框架漏洞攻略-ThinkPHP篇

漏洞名称&#xff1a;Thinkphp5x远程命令执行及getshell 第一步&#xff1a;开启靶场 第二步&#xff1a;准备工具 第三步&#xff1a;启动工具&#xff0c;进行漏洞检测 #存在漏洞 1.目标存在tp5_invoke_func_code_exec_1漏洞2.目标存在tp5_dbinfo_leak漏洞payload:http://47…...

若依框架二次开发——若依集成 JSEncrypt 实现密码加密传输方式

文章目录 一、问题场景二、相关技术介绍1. RSA 加密算法2. JSEncrypt三、实现步骤1. 前端加密处理2. 后端解密处理3. 登录逻辑处理四、测试流程1. 前端测试2. 后端测试3. 运行效果五、总结一、问题场景 在 RuoYi 系统中,默认情况下,用户在登录时会将明文密码直接传输到服务器…...

rabbitmq承接MES客户端服务器

文章目录 背景整体架构概述方案详细步骤1. 数据库选型与搭建2. 设备端数据上传至数据库3. 搭建 RabbitMQ 服务器4. 数据同步模块&#xff08;数据库到 RabbitMQ&#xff09;5. MES 服务器从 RabbitMQ 接收数据6. 指令接收模块&#xff08;RabbitMQ 到设备端&#xff09; 7. MES…...

Linux touch命令

参考资料 Linux 常用命令 - touch 【创建空文件与修改时间戳】 目录 一. 用法简介二. 配合扩展字符&#xff0c;批量创建文件三. 修改文件的时间戳3.1 -t 配置项3.2 -d 配置项3.3 配合find命令实现批量时间戳修改 四. 结合 find 批量创建相同时间的新文件 一. 用法简介 ⏹当指…...

LlamaFactory部署及模型微调【win10环境】

1.Llama-Factory简介 LLaMA-Factory&#xff0c;全称 Large Language Model Factory&#xff0c;旨在简化大模型的微调过程&#xff0c;帮助开发者快速适应特定任务需求&#xff0c;提升模型表现。它支持多种预训练模型和微调算法&#xff0c;适用于智能客服、语音识别、机器翻…...

vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】

前端编写 安装 axios 如果当前未安装axios&#xff0c;可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目&#xff0c;在 vite.config.ts 中配置代理&#xff0c;在defineConfig中新增server配置&#xff0c;主要关注两个点&#xff1a; 一、需要代…...