Python字典与集合:键值对与去重的艺术

📅 2026/8/20 11:29:40
Python字典与集合:键值对与去重的艺术
Python字典与集合键值对与去重的艺术上一篇我们学习了列表和元组本篇将学习字典dict和集合set它们是处理键值对和去重场景的利器。一、字典Dictionary字典是Python中唯一的映射类型用「键-值对」存储数据通过键快速查找值类似于现实中的字典通过词找释义。1. 创建字典# 空字典empty_dict{}empty_dict2dict()# 有数据的字典student{name:小明,age:18,city:北京,is_student:True}# 用dict()创建student2dict(name小红,age17,city上海)# 键值对列表转字典pairs[(name,小刚),(age,19)]student3dict(pairs)⚠️ 字典的键必须是不可变类型字符串、数字、元组不能用列表作为键。2. 访问字典值student{name:小明,age:18}# 方式一[]访问键不存在会报错KeyErrorprint(student[name])# 小明# 方式二get()访问键不存在返回None或默认值推荐print(student.get(age))# 18print(student.get(gender))# Noneprint(student.get(gender,未知))# 未知指定默认值3. 添加与修改student{name:小明,age:18}# 添加新键值对student[city]北京print(student)# {name: 小明, age: 18, city: 北京}# 修改已有键的值student[age]19print(student)# {name: 小明, age: 19, city: 北京}# 批量更新student.update({age:20,major:计算机})print(student)4. 删除student{name:小明,age:18,city:北京}# pop删除指定键并返回值agestudent.pop(age)print(age)# 18print(student)# {name: 小明, city: 北京}# popitem删除最后一个键值对Python 3.7laststudent.popitem()print(last)# (city, 北京)# del删除指定键delstudent[name]# clear清空字典student.clear()print(student)# {}5. 遍历字典student{name:小明,age:18,city:北京}# 遍历键forkeyinstudent:print(key)# 遍历值forvalueinstudent.values():print(value)# 遍历键值对推荐forkey,valueinstudent.items():print(f{key}:{value})6. 字典推导式# 基本形式squares{x:x**2forxinrange(1,6)}print(squares)# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 带条件even_squares{x:x**2forxinrange(1,11)ifx%20}print(even_squares)# {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}# 字典键值互换original{a:1,b:2,c:3}reversed_dict{v:kfork,vinoriginal.items()}print(reversed_dict)# {1: a, 2: b, 3: c}7. 字典的嵌套# 字典嵌套字典students{001:{name:小明,age:18,scores:[85,90,92]},002:{name:小红,age:17,scores:[88,95,91]}}print(students[001][name])# 小明print(students[002][scores][1])# 95二、集合Set集合是无序、不重复的元素集合主要用于去重和集合运算。1. 创建集合# 空集合注意{}是空字典不是空集合empty_setset()# 有元素的集合fruits{苹果,香蕉,橙子,苹果}# 重复元素会被自动去除print(fruits)# {苹果, 香蕉, 橙子}# 从列表创建去重numsset([1,2,2,3,3,3])print(nums)# {1, 2, 3}2. 添加与删除fruits{苹果,香蕉}# add添加单个元素fruits.add(橙子)print(fruits)# {苹果, 香蕉, 橙子}# update批量添加fruits.update([葡萄,西瓜])print(fruits)# remove删除元素不存在会报错fruits.remove(苹果)# discard删除元素不存在不报错推荐fruits.discard(不存在的水果)# pop随机删除一个元素并返回removedfruits.pop()# clear清空fruits.clear()3. 集合运算a{1,2,3,4,5}b{4,5,6,7,8}# 并集两个集合所有元素print(a|b)# {1, 2, 3, 4, 5, 6, 7, 8}print(a.union(b))# 交集两个集合共同元素print(ab)# {4, 5}print(a.intersection(b))# 差集a有但b没有print(a-b)# {1, 2, 3}print(a.difference(b))# 对称差集只在一个集合中出现的元素print(a^b)# {1, 2, 3, 6, 7, 8}print(a.symmetric_difference(b))# 子集判断print({1,2}a)# Trueprint({1,2}.issubset(a))# 超集判断print(a{1,2})# True4. 集合推导式# 生成1-10中偶数的集合evens{xforxinrange(1,11)ifx%20}print(evens)# {2, 4, 6, 8, 10}三、字典与集合的应用场景1. 字典的典型场景配置信息键值对存储配置计数统计统计元素出现次数缓存/映射快速查找JSON数据与JSON格式天然对应2. 集合的典型场景去重列表去重最简洁的方式成员判断集合的in操作比列表快得多O(1) vs O(n)集合运算交集、并集、差集等数学运算四、实战词频统计器importrefromcollectionsimportCounterdefword_frequency(text):统计文本词频# 提取单词转小写wordsre.findall(r[a-zA-Z],text.lower())# 方法一手动统计freq{}forwordinwords:freq[word]freq.get(word,0)1returnfreqdefword_frequency_counter(text):用Counter统计更简洁wordsre.findall(r[a-zA-Z],text.lower())returnCounter(words)# 测试textPython is a great programming language. Python is easy to learn. I love Python programming! Programming is fun.freqword_frequency(text)# 按频率排序输出Top5print(词频Top5:)forword,countinsorted(freq.items(),keylambdax:x[1],reverseTrue)[:5]:print(f{word}:{count}次)# 用Counter的most_commoncounterword_frequency_counter(text)print(\nCounter Top3:,counter.most_common(3))输出词频Top5: python: 3次 is: 3次 programming: 3次 a: 1次 great: 1次 Counter Top3: [(python, 3), (is, 3), (programming, 3)]五、实战找共同好友# 用集合找共同好友friends{小明:{小红,小刚,小丽,小强},小红:{小明,小刚,小美,小强},小刚:{小明,小红,小丽},小丽:{小明,小刚,小美},}defcommon_friends(name1,name2):找两个人的共同好友ifname1notinfriendsorname2notinfriends:returnset()returnfriends[name1]friends[name2]# 小明和小红的共同好友print(小明和小红的共同好友:,common_friends(小明,小红))# 输出: {小刚, 小强}# 谁的好友最多most_friendsmax(friends,keylambdax:len(friends[x]))print(f好友最多的人:{most_friends}{len(friends[most_friends])}个好友)# 找出所有人的共同好友all_commonset.intersection(*friends.values())print(所有人的共同好友:,all_commonifall_commonelse没有)六、常见坑点空集合的创建{}是空字典空集合要用set()字典键的类型键必须是不可变类型列表不能作为键字典遍历中删除遍历时不能修改字典大小应遍历列表副本# 错误forkind:ifcondition:deld[k]# 会报错# 正确forkinlist(d.keys()):ifcondition:deld[k]集合是无序的不能通过索引访问集合元素字典的get vs []get不会报错[]会报错优先用get七、课后练习编写程序输入一段文本统计每个中文字符出现的次数编写程序去除列表中的重复元素并保持原顺序编写程序给定两个列表找出它们的共同元素和各自独有的元素编写程序用字典实现一个简单的通讯录增删改查功能八、小结本篇学习了字典的增删改查、遍历、推导式以及集合的创建、运算和典型应用场景。字典适合键值对映射和快速查找集合适合去重和集合运算两者都是Python中非常高效的数据结构。下一篇预告《入门阶段实战学生成绩管理系统控制台版》本专栏持续更新中欢迎点赞、收藏、关注三连支持