关于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,一经查实,立即删除!

相关文章

相同含义但不同类型字段作为join条件时注意事项

假设表A和表B中都有表示学号的stu_id字段,但该字段在表A和表B中类型分别为bigint和string。当直接通过该字段进行join时,一般情况下可以得到我们预期的结果。 select a.stu_id from a as r join b as l on r.stu_id l.stu_id 但是如果学号长度较长的…

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

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

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

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

关于宏v4l2_subdev_call的拆解

struct v4l2_subdev *sd结构体 struct v4l2_subdev { #if defined(CONFIG_MEDIA_CONTROLLER)struct media_entity entity; #endifstruct list_head list;struct module *owner;bool owner_v4l2_dev;u32 flags;struct v4l2_device *v4l2_dev;const struct v4l2_subdev_ops *op…

数字滚动动画~

前言 数字从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…

vivado DRIVE、EDIF_EXTRA_SEARCH_PATHS

驱动器 DRIVE指定配置有I/O的输出缓冲器的输出缓冲器驱动强度&#xff08;mA&#xff09; 支持可编程输出驱动强度的标准。 体系结构支持 所有架构。 适用对象 •端口&#xff08;get_Ports&#xff09; 连接到输出缓冲器的输出或双向端口 价值观 整数值&#xff1a; • 2 • 4…

【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…

PyCharm\VsCode——Python第三方库下载换源

为什么要换源&#xff1f; Python第三方库下载默认镜像源在国外&#xff0c;因为特殊的原因在国内的你我利用这个镜像源往往速度会非常地慢&#xff0c;因此为了提速将这个默认镜像源换成国内的镜像源是非常有必要的。 镜像源的种类有哪些&#xff1f; 国外镜像源——官方 http…

Python基础学习笔记——异常

目录 一、bug的简介二、异常捕获预处理机制1. 继承2. 捕获与预处理3. 嵌套与传递 一、bug的简介 1947年&#xff0c;世界第一部万用计算机的进化版——马克2号&#xff08;Mark II&#xff09;的程序运行发生了异常&#xff0c;计算机程序之母格蕾丝经调试后&#xff0c;发现是…

C#实用的工具类库

Masuit.Tools Masuit.Tools大都是静态类&#xff0c;加密解密&#xff0c;反射操作&#xff0c;树结构&#xff0c;文件探测&#xff0c;权重随机筛选算法&#xff0c;分布式短id&#xff0c;表达式树&#xff0c;linq扩展&#xff0c;文件压缩&#xff0c;多线程下载&#xf…

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

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

DP(1) | Java | LeetCode 509, 70, 746 做题总结

509. 斐波那契数 https://leetcode.cn/problems/fibonacci-number/ 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i] 第i个斐波那契数值为dp[i] 确定递推公式 题目说了 F(n) F(n - 1) F(n - 2)dp数组如何初始化 题目说了 F(0) 0&#xff0c;F(1) 1确定遍历…

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;并向全社会…