Python字典深度探索:25个高级操作技巧

今天,我们踏入字典的神秘森林,挖掘那些不为人知的宝藏。字典,Python中的超级英雄,存储数据的魔法帽,今天我们将解锁它的20个高级特技,让你的代码飞起来!

1. 初始化大法:花式建字典

my_dict = {f'key{i}': i for i in range(5)}  # 利用字典推导,一键五键

这是字典推导式,像变魔术一样快速创建字典,f'key{i}'是动态生成键,i为值,效率与优雅并存!

2. 隐形合并术:|操作符

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged = dict1 | dict2  # 新在上,旧被覆盖

从Python 3.9开始,你可以直接用|来合并字典,简单粗暴,新值覆盖旧值。

3. 深度合并秘籍:deepmerge

合并嵌套字典?标准库没这功能?不怕,咱手写一个!

def deepmerge(dict1, dict2):for key in dict2:if key in dict1 and isinstance(dict1[key], dict) and isinstance(dict2[key], dict):deepmerge(dict1[key], dict2[key])else:dict1[key] = dict2[key]return dict1

这段代码走的是递归路线,层层深入,直到最底层,确保合并无遗漏。

4. 魔法键值对交换:zipdict联袂出演

keys = ['a', 'b', 'c']
values = [1, 2, 3]
swapped = dict(zip(values, keys))  # 值变键,键变值,乾坤大挪移

zip函数和dict构造器一结合,瞬间完成键值对的互换,是不是很神奇?

5. 神秘的get:安全取值法

my_dict = {'a': 1}
print(my_dict.get('b', '不存在的键'))  # 输出: '不存在的键'

get方法取值,即使键不存在也不会抛异常,还可以指定默认值,安全又体贴。

6. update的奥义:优雅的更新

my_dict.update({'d': 4})  # 静悄悄地添加或更新键值

update方法,不声不响地更新字典,还能处理嵌套结构,是个低调的实力派。

7. 键的遍历小径:keys()

for key in my_dict.keys():print(key, "=>", my_dict[key])  # 一步一印,遍历所有键

遍历字典的键,就像在森林中漫步,清晰而有序。

8. 值的探索之旅:values()items()

for value in my_dict.values():print(value)  # 只看果实,不问出处for key, value in my_dict.items():print(f"{key}: {value}")  # 键值成对,双宿双飞

values()遍历所有值,items()则是键值对的完美组合,让你的循环更加灵活。

9. 高级筛选:列表推导+字典

filtered = {k: v for k, v in my_dict.items() if v > 1}  # 只保留大于1的值

结合列表推导,轻松过滤出满足条件的键值对,简洁高效。

10. 字典转列表:逆向操作

as_list = list(my_dict.items())  # 字典瞬间变列表,键值对打包带走

当你需要将字典转换为列表时,这招非常实用,尤其是需要排序或进一步处理时。

11. 反转字典:角色互换

reversed_dict = {v: k for k, v in my_dict.items()}  # 键变值,值变键,反转世界

小心使用,这招可以瞬间改变字典的面貌,但要注意值的唯一性哦!

12. 快速计数:字典的统计力量

counts = {}
for item in ['apple', 'banana', 'apple']:counts[item] = counts.get(item, 0) + 1  # 统计出现次数,简单粗暴有效

统计元素出现次数的经典用法,适用于快速计数场景。

13. 字典的删除艺术:delpop

del my_dict['a']  # 直接删除键为'a'的项
key_to_remove = 'b'
removed_value = my_dict.pop(key_to_remove, '默认值')  # 删除并返回值,安全第一

del是粗犷的删除,pop则更细腻,还能处理不存在的键。

14. 遍历的高级形态:enumerate与字典

# 假设我们有列表和字典的关联
for index, key in enumerate(sorted(my_dict)):print(f"第{index+1}个键是:{key}")

结合enumerate遍历排序后的键,非常适合按序处理字典。

15. 键的唯一性检验:set的帮忙

keys_set = set(my_dict.keys())  # 转换成集合,检查键的唯一性

利用集合的特性,快速判断键是否重复,或者进行集合运算。

16. 默认工厂:defaultdict

from collections import defaultdict
dd = defaultdict(int)  # 缺省值为0,不再担心KeyError
dd['new_key'] += 1  # 自动初始化为0,然后加1

defaultdict,自动初始化指定类型的默认值,避免了频繁的if检查。

17. 深拷贝与浅拷贝:谁是谁的影子?

import copy
shallow_copy = copy.copy(my_dict)
deep_copy = copy.deepcopy(my_dict)
# 浅拷贝复制顶层,深拷贝连深层结构一起复制

了解拷贝的差异,对于处理嵌套字典至关重要。

18. 字典的排序:sorted的魔法

sorted_items = sorted(my_dict.items(), key=lambda x: x[1])  # 按值排序

通过sorted函数,你可以按照键或值对字典进行排序,非常灵活。

19. 清空字典:重置之旅

my_dict.clear()  # 一键清空,回归初心

有时候,放下一切,重新开始,也是一种解脱。

20. 字典表达式的奇技:一行代码的艺术

ages = {'Alice': 30, 'Bob': 24}
age_sum = sum(age for name, age in ages.items() if name.startswith('A'))  # 只计算名字以'A'开头的人的年龄总和

一行代码解决战斗,展现了Python的优雅与强大。


进阶技巧

21. 字典的合并与更新策略

在合并字典时,有时需要更加精细的控制。例如,如果两个字典有相同的键,你可能想根据某些条件选择值。虽然直接使用update|可以简单合并,但要实现更复杂的逻辑,可以这样做:

def custom_merge(dict1, dict2, selector_func):for key, value in dict2.items():if key in dict1:selected_value = selector_func(key, dict1[key], value)dict1[key] = selected_valueelse:dict1[key] = valuereturn dict1# 示例:如果值是数字,取最大值,否则保持原值
def selector(key, old_val, new_val):if isinstance(old_val, (int, float)) and isinstance(new_val, (int, float)):return max(old_val, new_val)else:return new_valmerged_dict = custom_merge(my_dict, another_dict, selector)

22. 字典的映射转换

字典不仅是数据的存储容器,也是转换数据的强大工具。使用字典来定义映射规则,可以轻松转换数据格式。

# 假设我们有一个代码缩写和全称的映射
code_to_name = {'APL': 'Apple Inc.', 'MSFT': 'Microsoft Corporation'}# 将一组代码转换为全称列表
names = [code_to_name[code] for code in ['APL', 'MSFT']]

23. 利用字典进行条件判断

字典可以作为查找表,快速执行基于键的条件判断,这在配置管理或错误码映射中特别有用。

error_codes = {404: "Not Found",500: "Internal Server Error"
}def get_error_message(code):return error_codes.get(code, "Unknown Error")print(get_error_message(404))  # 输出: Not Found

24. 字典的“视图”操作

字典提供了键视图(keys()), 值视图(values())和项视图(items()),这些视图是动态的,反映了字典的实时状态。利用它们可以进行高效的操作,比如交集、并集等,尽管直接对视图做集合运算在Python中并不直接支持,但可以间接实现类似效果。

dict1 = {1: 'a', 2: 'b'}
dict2 = {2: 'b', 3: 'c'}# 获取两个字典共有的键
common_keys = set(dict1).intersection(set(dict2))

25. 字典的压缩语法

结合列表推导或生成器表达式,字典的压缩语法可以让代码更加紧凑。

# 假设我们想基于某个条件快速构建字典
data = [(1, 'apple'), (2, 'banana')]
filtered_dict = {k: v for k, v in data if v.startswith('a')}

结语

这些高级技巧展示了Python字典的强大和灵活性。掌握它们,不仅能够提升你的代码质量,还能使你在面对复杂的数据处理任务时游刃有余。

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

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

相关文章

系统编程:线程相关

线程 相关函数及过程: 创建线程号; pthread_t tid; 创建线程:pthread_create(&tid, NULL, task, argv[1]); 定义线程执行函数:void *task(void *arg){ 线程退出:pthread_exit(ret);//线程结束后退出 } 等待所有线程结束:pthread_join(tid, (void **)&ret); 编译时增加…

计算机网络面试HTTP篇二

HTTP/1.1 如何优化? 问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求;在需要发送 HTTP 请求时,考虑如何减少请求次数&#xff…

常用网站收集

微信公众号 https://mp.weixin.qq.com/ 新浪邮箱 https://mail.sina.com.cn/?frommail 博客 https://blog.csdn.net/ 印象笔记 https://app.yinxiang.com/ b站 https://member.bilibili.com/ 微博 https://weibo.com/ QQ音乐 https://y.qq.com/ 网易云音乐 htt…

Springboot启动mongoDB报错后禁用mongoDB自动配置

一、背景 最近在项目当中使用到MongoDB的驱动及相关依赖,发现在启动的时候有MongoDB启动报错信息,目前也不直接使用MongoDB,所以把自动配置这一块在启动的时候去除掉。 二、操作方式 Application启动类,修改启动SpringBootAppli…

400技术汇 教你如何成为抓包高手!

Wireshark是目前使用最广泛的网络抓包分析工具,也是每一位网络攻城狮电脑里必装神器。当网络里发现恶意攻击、某人下载流量过大、设备互联丢包、协议交互失败等等情况时,通过Wireshark抓包定位问题根源,是最直接有效的手段。 然而如此强大的…

【C++】future/promise

future/promise 1 来源 需要从线程中返回异步任务结果情形时,c11之前: 使用指针在线程间共享数据。 传递一个指针到新的线程中,该线程在其中设置数据,直到主线程继续等待使用条件变量。当新线程设置数据并通知条件变量时&#x…

守护清远采矿安全:可燃气体报警器检定工作的必要性与实施

清远市地处广东省北部,矿产资源丰富,包括金属矿产、非金属矿产等多种类型。采矿行业作为清远的重要产业之一,对当地经济发展起到了积极的推动作用。 然而,随着采矿业的快速发展,安全问题也逐渐凸显出来,尤…

05 Pytorch 数据读取 + 二分类模型

05 Pytorch 数据读取 二分类模型05 Pytorch 数据读取 二分类模型05 Pytorch 数据读取 二分类模型 01 数据读取 DataLoader(set作为参数) 02 Dataset 从哪读,怎么读? 功能:数据从哪里读取? 如何读取…

【第十三课】区域经济可视化表达——符号表达与标注

一、前言 地图最直接的表达就是使用符号表达。使用符号可以把简单的点线面要 素渲染成最直观的地理符号,提高地图的可读性。只要掌握了 ArcGIS 符号制 作的技巧,分析符号并总结出规则,就可以制作符合要求的地图符号。 (一&#…

算法基础入门 - 1.排序

文章目录 算法基础入门第一章:排序1.1 桶排序1.2 冒泡排序1.3 快速排序1.4 买书问题算法基础入门 第一章:排序 1.1 桶排序 该算法好比桶,假设有11个桶,编号从0-11。每出现一个数,就往对应编号的桶中放入旗子,只需要数桶中旗子的个数即可。比如2号桶有1个旗子,表示2出…

自动化测试TCP和UDP的带宽

在一侧设备,执行iperf3 -s -i 1 另一侧设备执行以下脚本 测试长时间下以太网的tcp带宽和udp丢包率 测试某以太网转换盒的时候, 发现tcp带宽在刚开始的几分钟是800M左右,然后直线转为50M,并且长时间稳定 UDP的丢包率&#xff0…

Spring Boot整合ZXing实现二维码和条形码生成

1. 添加ZXing依赖到Spring Boot项目 场景描述: 在需要快速、高效地生成二维码或条形码的应用中,如电子票务、产品追踪、个人身份验证等,集成ZXing库至Spring Boot项目是至关重要的一步。 在项目的pom.xml文件中添加以下依赖以引入ZXing库: …

Appium APP测试学习

1、安装client编程库(客户端) (1)如果遇到以下问题可以使用全路径安装 (2)安装后导致selenium升级,导致某些方法失效:如find_element_by_id。解决方法:卸载两个安装包,后面重新安装 2、安装appium Server:(服务端&…

【码银送书第二十一期】《大数据智能风控:模型、平台与业务实践》

人行印发的《金融科技(FinTech)发展规划(2022一2025年)》明确指出金融科技成为防范化解金融风险的利器,运用大数据、人工智能等技术建立金融风控模型,有效甄别高风险交易,智能感知异常交易&…

每日热榜资源

获取更多资源,请关注公众号:阿宇的编程之旅,回复‘书签’获取 划水摸鱼官网 网站名称:划水摸鱼官网网址:划水摸鱼官网介绍:提供休闲放松的内容,让你在忙碌之余享受片刻的宁静。 鱼塘热榜 网…

【深度揭秘】AI 幻觉背后的技术真相与应对策略,探索人工智能的未来

写在前面 AI真的能分辨真实与虚构吗? 如果你的 AI 助手在关键会议中搬出了一个虚构的法律先例,你会不会想钻地洞? 我们准备好为 AI 的错误买单了吗? 当AI的“诊断”可能让医生瞬间变成“杀手”,你还敢信它的建议吗&am…

uniapp/vue中实现方框的移动、缩放,旋转操作(手指操作)

效果&#xff1a; <template><view class"container"><view class"rotatable" ref"view" :style"{ left: dragLeft px, top: dragTop px, transform: scale(${scale}) rotate(${currentRotation}deg), }"src"…

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据&#xff0c;优化了分类算法&#xff0c;支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类&#xff1b;一键生成危险点报告和交跨报告&#xff1b;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:289…

Selenium CSS 选择器详细讲解

详细介绍 CSS 选择器 By.CSS_SELECTOR 在 Selenium 中&#xff0c;By.CSS_SELECTOR 是一种强大且灵活的定位方式。它使用 CSS 选择器语法来查找页面上的元素。CSS 选择器支持复杂的查询语法&#xff0c;可以根据元素的标签、类名、ID、属性等进行组合定位。 示例 HTML <!…

解决Java中的AssertionError异常的常用方法

解决Java中的AssertionError异常的常用方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论在Java开发中常见的AssertionError异常&#xff0c;并…