关于Python中的字典你所不知道的七个技巧

01

引言

Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。

字典作为Python中最常使用的数据类型,大家几乎每个人都或多或少在项目中使用过字典,但是字典里有一些潜在的技巧可能并不是每个同学都会用到。

在本文中,我们将深入探讨七个关于字典的使用技巧,希望可以帮助到大家!

02

初始化技巧

如果让大家创建一个字典,大家可能80%都会直接选择{}来进行创建,代码示例如下:

# normal way of creating a dictionary``   ``d = {'apple':4, 'orange':5, 'pear':6, 'pineapple':7}

这里推荐大家直接使用 dict(key=value)的方式来创建字典,代码如下:

# 'better' way to creating same dictionary``   ``d = dict(apple=4, orange=5, pear=6, pineapple=7)

虽然两者实现了相同的功能,但是为什么第二种方式更好呢?

  • 使用 {} 创建字典时,我们需要在字符串的键上加上引号来说明我们key的数据类型为字符串;由于我们有很多元素,所以我们就需要不断输入新的引号;而我们第二种方式下,则不需要输入引号。

  • dict方法不适用于非字符串的键,因此这两种方式都有其具体使用的场合。

03

字典合并

这里推荐大家使用解包符号******来进行两个字典的合并,代码如下:

# here are 2 dicts``a = {1:1, 2:2}``b = {3:3, 4:4}``   ``# we can combine them using **``x = {**a, **b}``print(x) # {1:1, 2:2, 3:3, 4:4}

上述代码中的 ** 会将键值对解包到父字典中,我们也可以在组建新字典的时候添加新的键值对,代码如下:

# we can add normal key-value pairs too``a = {1:1, 2:2}``b = {3:3, 4:4}``   ``x = {**a, **b, 5:5}``print(x) # {1:1, 2:2, 3:3, 4:4, 5:5}

04

字典作为函数参数传递

我们可以使用**将字典作为函数关键字参数进行传递,我们来举个简单的例子,一般的函数调用如下:

# a function that takes in a, b, c``   ``def test(a, b, c):`    `print(a, b, c)``   ``test(a=1, c=2, b=3) # 1 3 2

我们也可以将包含key为 a、b 和 c 的字典动态地传入该函数,如下:

mydict = dict(a=1, b=2, c=3)``print(mydict) # {'a':1, 'b':2, 'c':3}``   ``# this is the same as test(a=1, b=2, c=3)``test(**mydict) # 1 2 3

上述代码中,我们使用 ** 进行字典解包,并将解包后相应的参数传递给对应的函数。

05

字典生成式

假设我们要创建以下字典 {1:1, 2:4, 3:9, 4:16},代码如下:

# normal way to create this``   ``d = {}``for i in range(1, 5):`    `d[i] = i**2``   ``print(d) # {1: 1, 2: 4, 3: 9, 4: 16}

使用字典生成式的代码如下:

# dict comprehension way to create this``   ``d = {i:i**2 for i in range(1, 5)}``   ``print(d) # {1:1, 2:4, 3:9, 4:16}

这两种方法都是正确和合法的。但要注意的是,字典生成式理解起来要优雅得多、读起来也容易得多。

我们再来看个嵌套字典的例子,一般写法如下:

# nested for loops``   ``d = {}``for i in range(2):`    `for j in range(2, 4):`        `d[(i,j)] = 0``   ``print(d)``   ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}

更优雅的写法如下:

# nested for loops in dict comprehension``   ``d = {(i,j):0 for i in range(2) for j in range(2, 4)}``   ``print(d)``   ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}

06

获取默认值

当我们访问一个不存在的键时,我们会得到 KeyError,如下:

d = {1:1, 2:2, 3:3}``   ``print(d[1])  # 1``print(d[4])  # KeyError

如果我们真的不希望出现 KeyError,则推荐使用字典中的get() 方法,如果键不存在,则返回 None。

# using .get()``   ``d = {1:1, 2:2, 3:3}``   ``print(d.get(1))  # 1``print(d.get(4))  # None

注意到上述代码中,我们得到的不是KeyError,而是None。

更进一步,我们也可以指定返回的默认值,代码如下:

# .get() but with custom default value``   ``d = {1:1, 2:2, 3:3}``   ``print(d.get(1, 100))    # 1``print(d.get(4, 100))    # 100``print(d.get(9, 100))    # 100

07

使用元组列表来创建字典

假设我们有以下元组构成的列表,示例如下:

# a list of tuples (of length 2)``   ``ls = [('apple', 4), ('orange', 5), ('pear', 6)]

则可使用以下技巧生成字典,代码如下:

# we can pass this into dict() to create a dict``   ``d = dict(ls)``print(d)  # {'apple': 4, 'orange': 5, 'pear': 6}

这对快速从元组创建字典非常有用,无需编写字典生成式。

08

遍历字典

假设我们有以下字典,如下:

# a dict``d = dict(apple=4, orange=5, pear=6)``   ``print(d) # {'apple':4, 'orange':5, 'pear':6}

当我们遍历 dict 本身时,我们则会生成所有 dict的键:

for k in d:`    `print(k)``   ``# apple``# orange``# pear

同时,我们也可以使用函数values()来访问字典dict中所有的值,如下:

for v in d.values():`    `print(v)``   ``# 4``# 5``# 6

此外,如果我们使用函数items(),则键和值都会生成一个元组,如下:

for k,v in d.items():`    `print(k, v)``   ``# apple 4``# orange 5``# pear 6

我自己认为函数items() 是最有用的方法,可以快速遍历字典中的所有键值对。

09

总结

本文介绍了Python中字典的七种有趣小技巧,使用这些技巧,可以快速提升大家的编码能力。

您学废了吗?

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

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

相关文章

【UE5.1 角色练习】16-枪械射击——瞄准

目录 效果 步骤 一、瞄准时拉近摄像机位置 二、瞄准偏移 三、向指定方向射击 四、连发 效果 步骤 一、瞄准时拉近摄像机位置 打开角色蓝图,在事件图表中添加如下节点,当进入射击状态时设置目标臂长度为300,从而拉近视角。 但是这样切…

勇攀新高峰|暴雨信息召开2024年中述职工作会议

7月8日至9日,暴雨信息召开2024年中述职工作会议,总结回顾了上半年的成绩和不足,本次会议采用线上线下的方式举行,公司各部门管理人员、前台市场营销人员参加述职,公司领导班子出席会议。 本次述职采取了现场汇报点评的…

数字滚动动画~

前言 数字从0.00滚动到某个数值的动画 实现&#xff08;React版本&#xff09; Dom <div className"number" ref{numberRef}>0.00</div> JS const _initNumber () > {const targetNumber 15454547.69;const duration 1500;const numberElement…

【UML用户指南】-33-对体系结构建模-系统和模型

目录 1、系统和子系统 2、模型和视图 3、跟踪 4、常用建模技术 4.1、对系统的体系结构建模 4.2、对系统的系统建模 模型是对现实世界的简化——即对系统的抽象&#xff0c;建立模型的目的是为了更好地理解系统。 1、系统和子系统 一个系统可能被分解成一组子系统&#…

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

esp32硬件电路设计

ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com)

每日一题~abc356(对于一串连续数字 找规律)

添加链接描述 题意&#xff1a;对于给定的n,m 。计算0~n 每一个数和m & 之后&#xff0c;得到的数 的二进制中 1的个数的和。 一位一位的算。最多是60位。 我们只需要计算 在 1-n这些数上&#xff0c;有多少个数 第i位 为1. 因为是连续的自然数&#xff0c;每一位上1 的…

Linux下的misc设备驱动

文章目录 前言一、misc是什么&#xff1f;二、调用API1.注册2.注销 三、驱动框架总结 前言 misc设备即杂项设备&#xff0c;Linux系统中类似按键、触摸屏都有专门框架处理&#xff0c;类似adc、蜂鸣器等设备无法明确其属于什么类型&#xff0c;一般就归属于杂项设备&#xff0…

Sqli-labs合集之环境搭建

Sqli-labs的搭建 搭建第一个SQL注入学习靶场环境&#xff1a; 软件&#xff1a;sqli-labs 安装过程&#xff1a; 1.源码地址&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based.&#xff1b; 2.将压缩包解压到phpst…

非线性系列(三)—— 非线性求解器算法分类

1. 总体认知 CAE中的非线性方程组求解主要依赖牛顿法&#xff08;及牛顿法的变体&#xff09;&#xff0c;步骤如下 以线搜索方法为例&#xff0c;流程如下: 2. 方法分类 适用范围大类小类描述牛顿法雅可比矩阵难获取拟牛顿法 Broyden&#xff08;Secant method&#xff09;、…

15. Revit API: Transaction(事务)与 Failures(故障处理)

前言 UI讲完&#xff0c;回到DB这块儿。在Document那篇&#xff0c;提到增删改查操作都是在Document上&#xff0c;是对Documet进行操作。 看到“增删改查”这四个&#xff0c;想到什么了没有&#xff1f; 数据库&#xff08;DB&#xff09;嘛~话说那本经典的红皮数据库的书叫…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求&#xff1a; 1&#xff0c;DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;办公区设备10.0.…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务&#xff0c;支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远&#xff0c;需要考虑的因素增多&#xff0c; 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护&#xff0c;并向全社会…

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…

DDoS攻击详解

DDoS 攻击&#xff0c;其本质是通过操控大量的傀儡主机或者被其掌控的网络设备&#xff0c;向目标系统如潮水般地发送海量的请求或数据。这种行为的目的在于竭尽全力地耗尽目标系统的网络带宽、系统资源以及服务能力&#xff0c;从而致使目标系统无法正常地为合法用户提供其所应…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址&#xff1a;从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器&#xff08;监视器&#xff09; &#xff08;1&#xff09;作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;简写语法——简单数据类型&#xff0c;直接监视 ① Watch:{ 数…

[Flink]二、Flink1.13

7. 处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API ,这也是 Flink 编程的核心。而我们知道,为了让代码有更强大的表现力和易用性, Flink 本身提供了多…

一文入门【NestJs】Controllers 控制器

Nest学习系列 ✈️一文带你入门【NestJS】 ✈️前言 流程图 Controllers 控制器主要负责处理传入请求&#xff0c;并向客户端返回响应&#xff0c;控制器可以通过路由机制来控制接收那些请求&#xff0c;通常一个Controllers种会有多个匹配路由&#xff0c;不同的路由可以知…

Spring源码二十一:Bean实例化流程四

上一篇Spring源码二十&#xff1a;Bean实例化流程三中&#xff0c;我们主要讨论了单例Bean创建对象的主要方法getSingleton的内部方法createBean&#xff0c;createBean方法中的resolveBeanClase方法与prepareMethodOverrides方法处理了lookup-method属性与repliace-method配置…