【Python】字典

news2024/11/14 15:20:21

文章目录

  • 一. 字典的创建
  • 二. 字典的操作
    • 1. 查找 key
    • 2. 新增键值对
    • 3. 删除键值对
    • 4. 遍历字典
      • 4.1 使用 for 循环遍历字典
      • 4.2 通过方法遍历字典
        • keys() 获取到字典中所有 key
        • values() 获取到字典中的所以 value
        • items 获取到字典中的所有键值对
  • 三. 理解字典操作的效率

一. 字典的创建

键值对是计算机中一个非常重要的概念,它由两部分组成:键(key)、值(value)
在这里插入图片描述
注意事项

  • 在 Python 的字典中,可以同时包含很多个键值对,但要求每一个键值对的键不能重复,值可以重复。
  • 一个字典中的 key 的类型不一定都一样
  • 一个字典中的 value 的类型也不必都一样
  • 字典对于 key 是什么类型,有约束
  • 字典对于 value 是什么类型,没有约束

可以有两种方法创建字典:

a = {}
print(type(a))
b = dict()
print(type(b))

-------运行结果-------
<class 'dict'>
<class 'dict'>

当然我们也可以在创建字典对象的同时设定初始值:
在这里插入图片描述

二. 字典的操作

字典的各种操作,都是针对 key 来进行的。

1. 查找 key

1)使用in、not in来判定某个 key 是否在字典中存在

a = {
    'id': 1,
    'name': 'zhangsan',
}

print('id' in a)
print('classId' in a)

-------运行结果-------
True
False

2)使用 [] 来根据 key 获取到 value

a = {
    'id': 1,
    100: 'hello'
}

print(a['id'])
print(a[100])
# 查找到之后可以修改 value 
a['id'] = 3
print(a['id'])

-------运行结果-------
1
hello
3

如果括号内的 key 不存在于字典对象中,那么在查找时就会抛异常:
在这里插入图片描述

对比字典和列表的查找操作

对于字典来说,使用 in 或者 [ ] 来获取 vlaue,都是非常高效的,因为字典背后使用了哈希表这个数据结构

对于列表来说,使用 in 是比较低效的,因为它需要把整个列表遍历一遍;而使用 [ ] 是比较高效的,它类似于数组或顺序表取下标的操作。

2. 新增键值对

直接使用使用[]插入键值对

a = {
    'id': 1,
    'name':'zhangsan'
}

# 这个操作就是往字典中插入新的键值对
a['score'] = 100

注意区分不同情况下 [ ] 的意义:
在这里插入图片描述
这里就和前面说的,变量的创建类似:

  • a = 10,a当前不存在,这里就是对于变量(创建新变量)
  • a = 10,a当前已经存在,这里就是修改变量

3. 删除键值对

使用pop(key)方法,根据 key 来删除键值对

a = {
    'id': 1,
    'name':'zhangsan'
}

a.pop('name')

-------运行结果-------
{'id': 1}

4. 遍历字典

遍历指的就是把一个可迭代对象,里面包含的元素依次取出来,并进行一些操作。

4.1 使用 for 循环遍历字典

a = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}

# 注意取出来的是 key
for key in a:
    print(key, a[key])
    
-------运行结果-------
id 1
name zhangsan
score 90

补充说明:在 C++ 或 Java 中,哈希表里键值对的存储是无序的(相对于 Python),但在 Python 中不一样,Python 做了特殊的处理,能保证遍历出来的顺序和插入的顺序一致。

4.2 通过方法遍历字典

keys() 获取到字典中所有 key

a = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}

print(a.keys())
    
-------运行结果-------
dict_keys(['id', 'name', 'score'])

values() 获取到字典中的所以 value

a = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}

print(a.values())
    
-------运行结果-------
dict_values([1, 'zhangsan', 90])

items 获取到字典中的所有键值对

a = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}

print(a.items())

-------运行结果-------
dict_items([('id', 1), ('name', 'zhangsan'), ('score', 90)])

三. 理解字典操作的效率

字典被设计出来的初衷,不是为了实现遍历,而是为了增删查改。字典是哈希表结果,所以它的增删查改操作效率是非常高的(常数级),而遍历的效率则要差一点。

不论字典中有多少元素,增删查改操作都是固定时间的,不会因为元素多了,操作就慢了。

那它是如何做到常数级效率的呢?在 Python 在专门提供一个hash()函数,通过这个函数,可以给每一个不可变对象(通常用来做 key)生成一个唯一的数字:

不可变对象,一般是可哈希的:

print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash((1, 2, 3, 4)))

-------运行结果-------
0
322818021289917443
3403014585841488972
1
590899387183067792

可变的对象,一般是不可哈希的:

# 列表是不可哈希的
print(hash([1, 2, 3, 4]))
# 字典也是不可哈希的
print(hash(dict()))

-------运行结果-------
TypeError: unhashable type: 'list'
TypeError: unhashable type: 'dict'

这样每一个不可变对象(key)都有唯一的常数(哈希值)。我们可以把这个常数理解成数组的下标,这样就能 O(1) 的效率定位到 key,从而拿到 value。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux--打印文件内容:cat

cat是cater的简写 语法&#xff1a; cat [选项] [文件] 常用选项&#xff1a; -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 示例&#xff1a; ①打印文件hello.c的内容 ②带行号打印文件hello.c的内容 ③输入什么&#xff0c;打印什么 ④输入重定向&…

讲座笔记:如何撰写高质量科技论文

1 论文总体思路 2 摘要 3 Intro 常见Introduction逻辑&#xff1a; 说明问题是什么&#xff1b;简单罗列前人工作&#xff1b;描述我们的工作。 说明问题是什么&#xff1b;目前最好的工作面临什么挑战&#xff1b;我们的方法能缓解上述挑战 3.1 段落写法 首先列出几句话 …

【 Linux】文件删除原理

文章目录 Linux文件删除原理文件的索引节点和链接文件删除的过程文件删除后是否能恢复 Linux文件删除原理 Linux是一个强大的操作系统&#xff0c;它提供了许多命令和工具来管理文件和目录。其中&#xff0c;最常用的命令之一就是rm&#xff0c;它可以用来删除不需要的文件或目…

Less简明教程

一.概述 Less是一种动态样式语言&#xff0c;它在CSS的基础上扩展了混合、嵌套、变量等实用功能。Less也是一种CSS预处理语言&#xff0c;less文件在经过less.js处理后&#xff0c;最终会生成.css文件&#xff0c;如下图所示&#xff1a; 1.动态样式语言的比较 动态样式语言主…

git push报错rejected:no-fast-forward

报错&#xff1a; 报错关键词&#xff1a; non-fast-forwardyour current branch is behindthe remote changes 即&#xff1a;不能快速前进、当前分支滞后、远端改变 原因&#xff1a; 这个分支下&#xff0c;别人提交了一些代码到远程仓库。对于这个改变&#xff0c;你没有…

SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的在线订餐小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代…

什么是 Kubernetes 服务器端应用 (SSA)?

自 2021 年 8 月 v1.22 版本发布以来,服务器端应用 (SSA) 已在 Kubernetes 中普遍可用。这是一种声明式资源管理策略,可通过将命令逻辑移至kubectl apply服务器来改进 diff 计算并警告合并冲突。 本文将解释 SSA 的工作原理以及为什么它比以前的客户端应用 (CSA) 方法更受青…

Python3 面向对象 | 菜鸟教程(十六)

目录 一、面向对象技术简介 &#xff08;一&#xff09;类(Class) &#xff08;二&#xff09;方法 &#xff08;三&#xff09;类变量 &#xff08;四&#xff09;数据成员 &#xff08;五&#xff09;方法重写 &#xff08;六&#xff09;局部变量 &#xff08;七&am…

并发-抽象队列同步器AQS应用Lock详解

锁的膨胀是指synchronized原本是无锁态&#xff0c;当有一个线程调用时变为偏向锁&#xff0c;当有多个线程排队自旋等待锁时会升级为轻量锁&#xff0c;当线程等待时间太长时会升级为重量级锁&#xff0c;这就是锁的膨胀过程&#xff0c;且是不可逆的。 锁的粗化是指如果在一个…

【总结】1727- 前端开发中如何高效地模拟数据?

&#x1f449; 「文章推荐」 详细聊一聊 Vue3 动态组件深入浅出 Vue3 自定义指令6 个你必须明白 Vue3 的 ref 和 reactive 问题初中级前端必须掌握的 10 个 Vue 优化技巧分享 15 个 Vue3 全家桶开发的避坑经验 在开发和测试工作中&#xff0c;mock 数据非常实用。mock 数据是指…

基于值的深度强化学习算法

目录 DQN2013 —— Playing Atari with Deep Reinforcement LearningDQN2015 —— Human-level control through deep reinforcement learning引用文献 DQN2013 —— Playing Atari with Deep Reinforcement Learning 论文下载地址 论文介绍 该论文提出了一个基于卷积神经网络…

数字IC验证环境的创建

本文介绍了从一组可重用的验证组件中构建测试平台所需的步骤。UVM促进了重用&#xff0c;加速了测试平台构建的过程。 首先对测试平台集成者&#xff08;testbench integrator&#xff09;和测试编写者&#xff08;test writer &#xff09;进行区分&#xff0c;前者负责测试平…

【Java EE】-博客系统二(前后端分离)

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 徘徊着的 在路上的 你要走吗 易碎的 骄傲着 那也曾是我的模样 ——《平凡之路》 主要内容&#xff1a;显示用户信息、上传头像、新增博客、删除博客、修改博客…

Android:设计模式

文章参考来源1 文章参考来源2 文章参考来源3 MVC Model 数据来源&#xff0c;管理业务数据逻辑&#xff0c;读取数据等 View 视图 Controller 单例模式&#xff0c;处理业务逻辑&#xff0c;负责改变Model和View 经典的MVC架构是 用户点击View&#xff0c;View将用户输入转…

springboot详细整合mybatisplus

SpringBoot详细整合mybatisPlus 文章目录 SpringBoot详细整合mybatisPlus一、引入mybatis_plus依赖二、修改mybatis_plus的yml配置三、添加mybatis_plus的其他配置以及包扫描四&#xff0c;修改mybatis的配置&#xff08;这一步根据实际情况修改&#xff09; 无奈&#xff0c;一…

三个关键数字变化,剖析中国智能手机市场的趋势及其影响

近期&#xff0c;全球行业分析机构CounterpointResearch公布了《中国智能手机高端市场白皮书》&#xff0c;对中国智能手机市场数据进行详细分析。该报告揭示了几个关键数据&#xff0c;值得深入剖析。 上面的图表展示了中国智能手机市场在2012年至2022年的11年间销量、平均价格…

UE5《Electric Dreams》项目PCG技术解析 之 PCGDemo_Ditch关卡详解

文章目录 前导文章关卡概要PCGGraphPoints From Actor Tag作为PCG的分割工具分层装饰 一些知识点和技巧使用Attribute Operation将属性暂存到临时属性中是否生成碰撞 小结 前导文章 《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》《UE5《Electric…

mac系统通过终端连接远程服务器

mac系统通过终端连接远程服务器 1、通过自带终端连接1.1 命令直接连接1.2 方式2——创建连接 2、通过iTerm2连接2.1 方式一&#xff1a;命令直接连接 3. Mac上使用scp命令 1、通过自带终端连接 1.1 命令直接连接 如下&#xff1a;ssh -p 22 root远程IP1.2 方式2——创建连接 …

类Twitter风格的RSS阅读器

本文完成于 2 月中旬&#xff0c;其中的反代还是 frp npm 方案&#xff1b; 什么是 RSS ? RSS 是用 PHP、Laravel、Inertia.js、Tailwind 和 Vue.js 编写的简单的类Twitter 风格的 RSS阅读器&#xff0c;支持 RSS和ATOM 格式。 命令行安装 在群晖上以 Docker 方式安装。 官…

形式化验证,QED: Quick Error Detection Tests for Effective Post-Silicon Validation(二)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…