Python编程第10课:Python元组(Tuple)和字典(Dict)详解

张开发
2026/4/9 23:43:16 15 分钟阅读

分享文章

Python编程第10课:Python元组(Tuple)和字典(Dict)详解
前言Python的两种重要容器类型在前面的课程中我们学习了列表(List)这一重要的容器类型。今天我们将学习另外两种同样重要的容器元组(Tuple)和字典(Dict)。元组与列表类似但它是不可变的适用于存储不变的数据集合字典则是键值对的形式存储数据能够通过键快速查找值是实现映射关系的理想数据结构。掌握这两种容器将大大提升你处理数据的能力。一、元组基础1.1 创建元组# 基本创建empty_tuple()single_tuple(1,)# 注意单个元素需要逗号numbers(1,2,3,4,5)mixed(1,hello,3.14,True)# 使用tuple()函数tuple_from_listtuple([1,2,3])tuple_from_stringtuple(Python)print(tuple_from_string)# (P, y, t, h, o, n)1.2 访问元组元素fruits(苹果,香蕉,橙子,葡萄)# 正向索引print(fruits[0])# 苹果print(fruits[1])# 香蕉# 负向索引print(fruits[-1])# 葡萄print(fruits[-2])# 橙子# 切片访问print(fruits[1:3])# (香蕉, 橙子)print(fruits[::2])# (苹果, 橙子)1.3 元组解包# 基本解包coordinates(10,20,30)x,y,zcoordinatesprint(fx{x}, y{y}, z{z})# x10, y20, z30# 交换变量a,b1,2a,bb,aprint(fa{a}, b{b})# a2, b1# 使用 * 接收剩余值head,*body,tail[1,2,3,4,5]print(fhead{head}, body{body}, tail{tail})# head1, body[2, 3, 4], tail5# 多个变量同时赋值name,age,city小明,18,北京1.4 元组与列表的区别# 列表是可变的list_demo[1,2,3]list_demo[0]100print(list_demo)# [100, 2, 3]# 元组是不可变的tuple_demo(1,2,3)tuple_demo[0]100# TypeError: tuple object does not support item assignment# 元组的可变操作转换为列表temp_listlist(tuple_demo)temp_list[0]100tuple_demotuple(temp_list)二、元组常用操作2.1 基本操作# 连接元组t1(1,2,3)t2(4,5,6)t3t1t2print(t3)# (1, 2, 3, 4, 5, 6)# 重复元组t(1,2)print(t*3)# (1, 2, 1, 2, 1, 2)# 成员检查print(1in(1,2,3))# Trueprint(4in(1,2,3))# False# 元组长度print(len((1,2,3)))# 32.2 元组方法numbers(1,2,3,2,4,2)# count() - 统计元素出现次数print(numbers.count(2))# 3# index() - 查找元素索引print(numbers.index(3))# 2print(numbers.index(2))# 3返回第一个匹配的索引2.3 命名元组fromcollectionsimportnamedtuple# 定义命名元组类型Pointnamedtuple(Point,[x,y,z])# 创建实例pPoint(10,20,30)print(p.x,p.y,p.z)# 10 20 30print(p[0],p[1],p[2])# 10 20 30三、字典基础3.1 创建字典# 基本创建empty_dict{}person{name:小明,age:18,city:北京}# 使用dict()函数person2dict(name小红,age20,city上海)# 从键值对列表创建pairs[(name,小明),(age,18)]person3dict(pairs)# 使用zip合并两个序列keys[name,age,city]values[小李,22,广州]person4dict(zip(keys,values))3.2 访问字典person{name:小明,age:18,city:北京}# 通过键访问print(person[name])# 小明# get()方法更安全print(person.get(name))# 小明print(person.get(gender))# None不报错print(person.get(gender,未知))# 未知提供默认值# 遍历字典forkeyinperson:print(f{key}:{person[key]})forkey,valueinperson.items():print(f{key}:{value})forvalueinperson.values():print(value)forkeyinperson.keys():print(key)3.3 添加和修改person{name:小明,age:18}# 添加键值对person[city]北京print(person)# {name: 小明, age: 18, city: 北京}# 修改值person[age]20print(person)# {name: 小明, age: 20, city: 北京}# 批量添加person.update({phone:123456,email:testexample.com})print(person)3.4 删除操作person{name:小明,age:18,city:北京}# del 删除键值对delperson[age]print(person)# {name: 小明, city: 北京}# pop() 删除并返回值removedperson.pop(city)print(f删除的:{removed})# 删除的: 北京print(person)# {name: 小明}# popitem() 删除最后一个键值对person{name:小明,age:18,city:北京}key,valueperson.popitem()print(f删除的:{key}:{value})# 删除的: city: 北京# clear() 清空字典person.clear()print(person)# {}四、字典常用操作4.1 字典方法person{name:小明,age:18,city:北京}# setdefault() - 如果键不存在则添加person.setdefault(country,中国)print(person)# {name: 小明, age: 18, city: 北京, country: 中国}# copy() - 浅拷贝person2person.copy()person2[name]小红print(person)# {name: 小明, ...}原字典不变print(person2)# {name: 小红, ...}# fromkeys() - 用键创建字典keys[a,b,c]default_dictdict.fromkeys(keys,0)print(default_dict)# {a: 0, b: 0, c: 0}4.2 字典推导式# 基本语法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}swapped{v:kfork,vinoriginal.items()}print(swapped)# {1: a, 2: b, 3: c}4.3 嵌套字典# 嵌套字典students{小明:{math:85,english:92},小红:{math:78,english:88},小李:{math:95,english:85}}# 访问嵌套字典print(students[小明][math])# 85# 添加成绩students[小王]{math:82,english:90}# 遍历嵌套字典forname,scoresinstudents.items():avgsum(scores.values())/len(scores)print(f{name}: 平均分{avg:.1f})五、实战项目通讯录管理系统5.1 项目需求添加联系人搜索联系人查看所有联系人删除联系人修改联系人信息5.2 完整代码defaddress_book():通讯录管理程序contacts{}# 存储联系人信息defshow_menu():print(\n*40)print(通讯录管理系统)print(*40)print(1. 添加联系人)print(2. 搜索联系人)print(3. 查看所有联系人)print(4. 删除联系人)print(5. 修改联系人)print(0. 退出)print(*40)defadd_contact():nameinput(请输入姓名: ).strip()ifnotname:print(姓名不能为空)returnifnameincontacts:print(f联系人 {name} 已存在)returnphoneinput(请输入电话: ).strip()emailinput(请输入邮箱 (可选): ).strip()addressinput(请输入地址 (可选): ).strip()contacts[name]{phone:phone,email:email,address:address}print(f已添加联系人:{name})defsearch_contact():keywordinput(请输入搜索关键字: ).strip().lower()ifnotkeyword:print(搜索关键字不能为空)returnfound[]forname,infoincontacts.items():if(keywordinname.lower()orkeywordininfo[phone].lower()orkeywordininfo[email].lower()):found.append((name,info))iffound:print(f\n找到{len(found)}个匹配结果:)forname,infoinfound:print(f\n姓名:{name})print(f 电话:{info[phone]})print(f 邮箱:{info[email]})print(f 地址:{info[address]})else:print(未找到匹配的联系人)defshow_all():ifnotcontacts:print(\n通讯录为空)returnprint(f\n通讯录 (共{len(contacts)}个联系人):)print(-*40)forname,infoincontacts.items():print(f姓名:{name})print(f 电话:{info[phone]})print(f 邮箱:{info[email]})print(f 地址:{info[address]})print(-*40)defdelete_contact():nameinput(请输入要删除的联系人姓名: ).strip()ifnameincontacts:delcontacts[name]print(f已删除联系人:{name})else:print(f未找到联系人:{name})defupdate_contact():nameinput(请输入要修改的联系人姓名: ).strip()ifnamenotincontacts:print(f未找到联系人:{name})returnprint(f当前信息:)print(f 电话:{contacts[name][phone]})print(f 邮箱:{contacts[name][email]})print(f 地址:{contacts[name][address]})print(\n请输入新信息直接回车保留原值:)phoneinput(f电话 [{contacts[name][phone]}]: ).strip()emailinput(f邮箱 [{contacts[name][email]}]: ).strip()addressinput(f地址 [{contacts[name][address]}]: ).strip()ifphone:contacts[name][phone]phoneifemail:contacts[name][email]emailifaddress:contacts[name][address]addressprint(f已更新联系人:{name})whileTrue:show_menu()choiceinput(\n请输入选项: )ifchoice1:add_contact()elifchoice2:search_contact()elifchoice3:show_all()elifchoice4:delete_contact()elifchoice5:update_contact()elifchoice0:print(感谢使用通讯录)breakelse:print(无效的选项)if__name____main__:address_book()总结本课程学习了元组不可变的序列支持解包操作元组与列表区别元组不可变适合存储不变数据字典键值对存储快速查找字典操作添加、删除、遍历、嵌套字典推导式简洁创建字典实战项目通讯录管理系统核心要点元组用圆括号()字典用花括号{}元组不可变字典可变字典通过键快速查找值使用.items()遍历键值对使用dict.fromkeys()快速创建字典下一篇预告Python编程第11课Python字符串(String)处理技巧

更多文章