关于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中字典的七种有趣小技巧,使用这些技巧,可以快速提升大家的编码能力。

您学废了吗?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

院内导航:如何用科技破解就医找路难题

自2019年开始“院内导航”被纳入医院智慧服务评估体系以来,到2023年改善就医服务升级的部署,每一步都见证了我国医疗卫生体系向智能化、人性化迈进的坚实步伐。 面对庞大复杂的医院环境与日益增长的就诊需求,如何让患者在茫茫人海中迅速找到就…

31_JQuery一文读懂,JS的升级版

今日内容 零、 复习昨日 一、JQuery 零、 复习昨日 1 js数组的特点(长度,类型,方法) - js数组的长度不限 - 类型不限 - 提供很多方法2 js中和的区别 - 判断数值相等 - 判断数值和数据类型同时相等3 js表单事件的事件名(事件属性单词) - 获得焦点 onfocus - 失去焦点 onblur …

干货:XXX智慧城市大数据共享交换平台建设方案(145页word)

引言:智慧城市大数据共享交换平台建设方案旨在构建一个高效、安全、可扩展的数据共享与交换生态系统,以促进城市内不同部门、机构及企业间的数据互联互通,推动数据资源的深度整合与利用,加速智慧城市建设进程。 方案介绍&#xff…

TongRDS 2214 docker版指引(by lqw )

文章目录 前言准备工作中心节点服务节点哨兵节点 前言 部署docker版本,建议先参考TongRDS2214手动部署版指引(by lqwsy) 在本地手动部署了一套适合业务场景的rds 服务后,再通过dockerfile 打镜像。 准备工作 1.准备对应的安装包…

开始性能测试之前的准备工作!

性能测试是软件测试中不可或缺的一部分,它可以帮助我们评估软件系统的性能表现,并找出潜在的性能瓶颈。在进行性能测试之前,需要做好充分的准备工作,以确保测试的有效性和准确性。 1. 确定性能测试的目标和范围 * 明确测试目标:性…

网口变压器下方是否要挖空探讨

一. 引言 1. RJ45组成 RJ45模块用于PHY芯片之间的互连,如图1所示,RJ45有两种组合形式,一种是分立式,网络变压器和RJ45连接座是分开的,另一种是网络变压器和RJ45集成在一起。RJ45连接座又分为带屏蔽与不带屏蔽两种。 …

C++基础编程100题-021 OpenJudge-1.4-01 判断数正负

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/01/ 描述 给定一个整数N&#xff0c;判断其正负。 输入 一个整数N(-109 < N < 109) 输出 如果N > 0, 输出positive; 如果N 0, 输出zero; 如果N < 0, 输出negative 样例输入 1样例输出…

MySQL空间索引

空间类型是建立在空间类型字段上的。 空间类型 MySQL的空间类型很多&#xff0c;我就不逐一介绍了。重要分四大类&#xff1a; GeometryCurveSurfaceGeometryCollection 前三种&#xff0c;地理、曲线、曲面都是不可实例化的。Geometry有一个子类Point, Curve有一个直接子类L…

新手小白的pytorch学习第一弹-------张量

1 导入pytorch包 import torch2 创建张量&#xff08;tensor&#xff09; scalar标量 scalar torch.tensor(7) scalartensor(7)scalar.ndim查看scalar的维度&#xff0c;因为scalar是标量&#xff0c;所以维度为0 0scalar.shapetorch.Size([])torch.item()7vector&#xf…

coco_eval 使用

参考 coco eval 解析 COCO目标检测比赛中的模型评价指标介绍&#xff01; coco 的评估函数对应的是 pycocotools 中的 cocoeval.py 文件。 从整体上来看&#xff0c;整个 COCOeval 类的框架如图&#xff1a; 基础的用法为 # The usage for CocoEval is as follows: cocoGt…

JUC并发编程-05:线程高级部分-源码解读

线程高级部分-源码解读 多线程高并发底层锁机制与优化最佳实践深入JDK源码理解LongAdder的分段CAS优化机制 公平锁和非公平锁原理解析 多线程高并发底层锁机制与优化最佳实践 深入JDK源码理解LongAdder的分段CAS优化机制 多个线程进入&#xff0c;为了防止空转&#xff0c;所…

一文入门【NestJs】Controllers 控制器

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

react 组件通信 —— 父子传值 【 函数式/类式 】

1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…

Spark源码详解

https://www.cnblogs.com/huanghanyu/p/12989067.html#_label3_3

【开源项目】H264码流格式解析

目录 1.概述2.头文件的定义2.1 基础头文件&#xff08;base.h&#xff09;2.2 H264码流读取文件&#xff08;bs.h&#xff09;2.2.1 单比特读取函数&#xff08;bs_read_u1&#xff09;2.2.2 指数哥伦布无符号编码&#xff08;bs_read_ue&#xff09;2.2.3 指数哥伦布有符号编码…

这类工作要被大语言模型取代?

春节前&#xff0c;哈佛的一篇文章带来了思考。 美国哈佛大学网站上有一篇文章探讨了ChatGPT对写作工作的代替可能性。 文章内容是围绕哈佛大学的一位校聘作家和一位有名望的心理学教授之间的对话展开&#xff0c;主要讲了一个基本的观点&#xff1a; 类似ChatGPT这样的人工…

解决Invalid or unsupported by client SCRAM mechanisms(dbeaver)

在用工具&#xff08;dbeaver&#xff09;链接Opengauss数据库的时候&#xff0c;报出标题的错误。原因为驱动不正确。 驱动下载地址&#xff1a;https://opengauss.org/zh/download/ 下载完的包 &#xff0c;解压后&#xff0c;里面应该有两个jar 包,使用postgresql.jar dbe…

HTTP 概况

Web的应用层协议是超文本传输协议(HyperTextTransferProtocol&#xff0c;HTTP)&#xff0c;它是 Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中&#xff0c;通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及…

C++入门基础篇(下)

目录 6.引用 6.1 引用的特性 6.2 const引用 7.指针和引用的关系 8.内联函数 9.nullptr 6.引用 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c; 它和它引⽤的变量共⽤同⼀块内存空间。比如&a…

深入了解代理IP常见协议:区别与选择

代理服务器在网络使用中扮演着重要的角色&#xff0c;是您设备和互联网之间的中间层。它不仅可以增强网络访问的安全性和隐私保护&#xff0c;还可以提供许多灵活的应用。使用代理时&#xff0c;不同的协议类型对数据交换具有不同的规则和特征。常见的代理协议包括HTTP代理、HT…