内容正文:
项目5 灵活使用组合数据
项目内容
随机分配办公室
识别单词
中英文数字对照表
01
02
03
项目目标
知识目标
熟悉组合数据类型的分类
熟悉序列类型的特点
熟悉列表类型的特点及基本操作
熟悉字典类型的特点及基本操作
会运用列表和元组解决实际问题
会运用字典和集合解决实际问题
技能目标
3
识别单词
03
认识集合
Python中的集合不同于列表和元组类型,集合存储的元素是无序的且不允许重复的。集合不能像列表、元组一样通过索引访问元素,但集合可以执行集合的并、交、差等运算。集合的使用频率虽然没有像列表、元组那样高。
Python中的集合存储的元素是无序的且不允许重复。常用于成员关系的测试和从序列中删除重复项。
创建集合
Python中的集合分为可变集合与不可变集合。可变集合:由set()函数创建,集合中的元素可以动态地增加或删除。不可变集合:由frozenset()函数创建,集合中的元素不可改变。
set()函数的语法格式如下:
frozenset()函数的语法格式如下:
set([iterable]) set() set([1,2,3,4,5,6])
上述函数的参数iterable接收一个可迭代对象,若没有指定可迭代的对象,则会返回一个空的集合。
frozenset([iterable]) frozenset('python')
使用set()函数创建可变集合。
直接使用花括号创建可变集合,花括号中的多个元素以逗号分隔。
可变集合的创建
set_one = set([1, 2, 3])
set_two = set((1, 2, 3))
set_three = {1, 2, 3}
使用frozenset()函数创建不可变集合。
不可变集合的创建
frozenset_one = frozenset(('a', 'c', 'b', 'e', 'd'))
frozenset_two = frozenset(['a', 'c', 'b', 'e', 'd'])
创建集合
实例3:已知列表li_one=[1,2,1,2,3,5,4,3,5,7,4,7,8],编写程序实现删除列表li_one中重复数据的功能。
提示:可以利用集合的不可重复性来实现,即将列表转换为集合,重复数据即可被去除。
li_one = [1,2,1,2,3,5,4,3,5,7,4,7,8]
li_one = list(set(li_one))
print(li_one)
复制集合
由于集合是无序的,因此,集合不支持索引和切片操作,仅支持部分序列的通用操作。
>>> set1={"123",521,"xyz"}
>>> set2=set1.copy()
>>> print(set2)
{'123', 521, 'xyz'}
清空集合
clear()方法可以清空可变集合中的元素。
clear_set = {'red', 'green', 'black'}
clear_set.clear()
print(clear_set)
添加元素
可变集合的add() 或update()方法都可以实现向集合中添加元素,其中 add()方法只能添加一个元素,而update()方法可以添加多个元素。
demo_set = set()
demo_set.add('py') demo_set.update("thon")
print(demo_set)
删除元素
remove()方法用于删除可变集合中的指定元素。
discard()方法可以删除指定的元素,但若指定的元素不存在,该方法不执行任何操作。
pop()方法用于删除可变集合中的随机元素。
remove_set = {'red', 'green', 'black'}
remove_set.remove('red')
print(remove_set)
remove_set.discard('green')
remove_set.discard(‘blue')
print(remove_set)
remove_set.pop()
print(remove_set)
集合应用
实例4:模拟生成产品序列号。
假设每款产品都有一个25位的、用来区分每款产品的产品序列号。产品序列号由五组被“-”分隔开的字母和数字混合编制的字符串组成,每组字符串由五个字符组成,如36XJE-86JVF-MTY62-7Q97Q-6BWJ2。每个字符取自以下24个字母和数字中的一个:BCEFGHJKMPQRTVWXY2346789,采用这24个字符的原因是为了避免混淆相似的字母和数字,如l和1,o和0等,避免产生不必要的麻烦。
本实例要求在两行中分别输入一个正整数,第一个表示要生成序列号的个数,第二个表示随机数种子。随机数种子函数为random.seed(n)。输出指定个数的序列号。
代码如下:
import random
n=int(input())
x=int(input())
se={'B','C','E','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'}
random.seed(x)
for i in range(n):
st=''
for j in range(5):
for k in range(5):
st+=random.choice(list(se))
st+='-'
print(st[:-1])
认识字典
Python中,字典(dict)是映射类型的体现,它是“键-值”数据项的组合,每个元素是一个键值对,即元素是(key, value),元素之间是无序的。键值对(key, value)是一种二元关系。
创建字典
使用花括号“{}”创建字典时,字典的键(key)和值(value)使用冒号连接,每个键值对之间使用逗号分隔。
使用花括号创建字典
{“中国“:”北京”, “法国“:”巴黎" }
{“刘红“:397, “吴静“:389, “李琳“:393 }
{}
使用dict()函数创建字典时,键和值使用“=”进行连接。
使用dict()函数创建字典
dict(中国=”北京”, 法国=”巴黎“)
dict(刘红=397,吴静=389,李琳=393 )
dict( )
访问字典
color_dict = {'purple': '紫色','green': '绿色','black': '黑色'}
color_dict['purple']
color_dict[‘red']
Traceback (most recent call last):
KeyError: 'red'
为了避免引起KeyError异常,当访问字典元素时需要先使用in与not in检测某个键是否存在。
在字典中,不能通过索引和切片操作来访问元素,只能通过“键”来访问所对应的“值”。由于字典中的键是唯一的,因此,可以通过键获取对应的值。如果字典中不存在待访问的键,就会引发KeyError异常。
字典应用
实例5:查询手机号。利用字典建立一个通信录,编写一个查询手机号码的程序。
pho={'张溢':13966527738,'李梅':17789665533,'王雪':17359782211,'赵亮':18259676767,'钱糖':15973984490}
name = input('输入要查询人的姓名:')
if name in pho:
print("%s的手机号码是%s"%(name,pho[name]))
else:
print("通信录里没有%s的手机号码"%name)
遍历字典
使用items()方法可以查看字典的所有元素,该方法会返回一个dict_items对象。dict_items对象支持迭代操作,结合for循环可遍历其中的数据,并将遍历后的数据以(key, value)的形式显示。
遍历字典的所有元素
per_info = {'001': '张三', '002': '李四', '003': '王五'}
print(per_info.items())
for i in per_info.items():
print(i)
字典的遍历包括遍历所有的元素、遍历所有的键及遍历所有的值。
遍历字典
遍历字典中的所有键
通过keys()方法可以查看字典中所有的键,该方法会返回一个dict_keys对象 。dict_keys对象支持迭代操作,通过for循环遍历输出字典中所有的键。
per_info = {'001': '张三', '002': '李四', '003': '王五'}
print(per_info.keys())
for i in per_info.keys():
print(i)
遍历字典
遍历字典中的所有值
使用values()方法可以遍历字典的所有值, 该方法会返回一个dict_values对象。dict_values对象支持迭代操作,可以使用for循环遍历输出字典中所有的值。
per_info = {'001': '张三', '002': '李四', '003': '王五'}
print(per_info.values())
for i in per_info.values():
print(i)
字典遍历
实例6:统计字母出现的次数。
已知字符串str=‘goodmorning,Python!’,请利用字典记录各个字符及其出现的次数。本实例需要首先创建一个空字典,将字符串中的每一个字母作为字典的键来遍历所有的键,通过遍历统计不同字母出现的次数。
str = 'goodmorning,Python!'
count = {}
for i in str:
if i in count.keys():
count[i] += 1
else:
count[i] = 1
print(count)
复制字典
字典中不允许出现相同的“键”,可以重复出现多个相同的“值”。
>>> dict1={'chinese': 100, 'math': 95, 'english': 97}
>>> dict2= dict1.copy()
>>> print(dict2)
{'chinese': 100, 'math': 95, 'english': 97}
清空字典
利用clear()方法和del命令可以清空字典中的元素。
>>> dict1={'chinese': 100, 'math': 95, 'english': 97}
>>> dict1=dict1.clear()
>>> print(dict1)
None
>>> dict2={'a': 1, 'b': 2, 'c': 3}
>>> print(dict2)
{'a': 1, 'b': 2, 'c': 3}
>>> del dict2 # 利用关键字清空字典
添加字典元素
字典可通过update()方法或指定的键添加元素。
add_dict = {'stu1': '小明'}
add_dict.update(stu2='小刚')
add_dict['stu3'] = '小兰'
print(add_dict)
删除字典元素
pop()方法可以根据指定的键删除字典中的指定元素,若删除成功则返回目标元素的值。
per_info = {'001': '张三', '002': '李四', '003': '王五', '004': '赵六', }
per_info.pop('001')
print(per_info)
使用popitem()方法可以随机删除字典中的元素,若删除成功则返回目标元素。
popitem()方法
per_info = {'001': '张三', '002': '李四', '003': '王五', '004': '赵六'}
per_info.popitem()
print(per_info)
pop()方法
修改字典元素
字典可通过update()方法或指定的键修改元素。
modify_dict = {'stu1': '小明', 'stu2': '小刚', 'stu3': '小兰'}
modify_dict.update(stu2='张强')
modify_dict['stu3'] = '刘婷'
print(modify_dict)
字典应用
实例7:校验身份证号。
中国目前采用的是18位身份证号,其中第7~10位数字是出生年,第11、第12位数字是出生月份,第13、第14位数字是出生日期,第17位数字是性别,奇数为男性,偶数为女性,第18位数字是校验位,若身份证号码中的一位数字填错了(包括最后一个校验位),则校验算法可以检测出来。若身份证的相邻两位填反了,则校验算法也可以检测出来。身份证号的校验规则如下。
(1)将身份证号码前面的17位数字分别乘以不同的系数。从第1位到第17位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
(2)将这17位数字和系数相乘的结果相加。
(3)用加出来的和除以11,其余数只可能是:0-1-2-3-4-5-6-7-8-9-10,分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2。
(4)通过上面的规则和操作得知,如果余数是2,就会在身份证的第18位数字上出现罗马数字X,如果余数是10,那么身份证的最后一位号码是2。
本实例是用户输入一个身份证号码,校验其是否是合法的身份证号码。
字典应用
id=input('请输入身份证号:')
sum=0
tu=('7','9','10','5','8','4','2','1','6','3','7','9','10','5','8','4','2')
d={0:'1',1:'0',2:'X',3:'9',4:'8',5:'7',6:'6',7:'5',8:'4',9:'3',10:'2'}
for i in range(17):
sum+=int(id[i])*int(tu[i])
if id[17]=='X':
if sum%11==2:
print('身份证号码校验为合法号码!')
else:
print('身份证校验位错误!')
elif (sum%11+int(id[17]))%11==1:
print('身份证号码校验为合法号码!')
else:
print('身份证校验位错误!')
任务实践-识别单词
周一到周日的英文单词依次为:Monday、Tuesday、Wednesday、Thusday、Friday、Saturday和Sunday,这些单词的首字母基本都不相同,在这7个单词的范围之内,通过第一个或前两个字母即可判断对应的是哪个单词。
本任务要求编写程序,实现根据第一或前两个字母输出Monday、Tuesday、Wednesday、Thusday、Friday、Saturday和Sunday之中完整单词的功能。
根据题意,本任务的完整单词包含Monday、Tuesday、Wednesday、Thusday、Friday、Saturday和Sunday7个,其中,Monday、Wednesday、Friday可根据用户输入的首字母判断,Tuesday和Thusday、Saturday和Sunday需根据用户连续输入两次字母才能进一步判断,具体规则如下:
(1)若用户第一次输入的字母为 “m”、“w”和“f”,则直接返回“Monday”、“ Wednesday”和“Friday”;
(2)若用户第一次输入“t”,需要再输入第2个字母进行判断,输入“h”返回“Thusday”,输入“u”返回“Tuesday”;
(3)若用户第一次输入“s”,需要再输入第2个字母进行判断,输入“a”返回“Saturday”,输入“u”返回“Sunday”;
(4)若用户第一次输入其它字母,则提示用户“请输入正确的字母”。
从以上分析可知,第一个或第二个字母可以作为获取完整单词的键,因此,可以创建一个包含7个键值对的字典,其中,键“m”、“w”和“f”对应的值为“Monday”、“Wednesday”和“Friday”,而键“t”和“s”对应的值是字典{'h': 'thursday', 'u': 'tuesday'}和{'a': 'saturday', 'u': 'sunday'}。
代码如下:
#识别单词
tu_th = {'h': 'Thursday', 'u': 'Tuesday'}
sa_su = {'a': 'Saturday', 'u': 'Sunday'}
week = {'t':tu_th,'s':sa_su,'m':'Monday','w':'Wednesday','f':'Friday'}
first_char = input('请输入第一位字母:').lower().strip()
if first_char in ['a', 't', 's', 'm', 'w', 'f']:
if week[first_char] == tu_th or week[first_char] == sa_su:
second_char = input('请输入第二位字母:').lower().strip()
if second_char in ['u', 'h', 'a']:
print(week[first_char][second_char])
else:
print('请输入正确字母')
else:
print(week[first_char])
else:
print('请输入正确的字母')
项目总结
本项目通过3个任务分别介绍了Python中列表与元组、集合与字典的基本使用方法。首先介绍了列表,包括创建列表、访问列表、列表的遍历和排序、嵌套列表,以及添加、删除和修改列表元素等。然后介绍了元组,包括创建元组、访问元组等。最后介绍了集合和字典,包括创建集合、集合的操作、集合类型操作符创建字典、访问字典、字典的操作等。
通过本项目的学习,能够掌握列表和元组的基本使用方法,并能灵活运用列表和元组进行Python程序开发。能够熟练使用字典和集合存储数据,为后续的开发打好基础。
$$