字典(dict)的每个键值对(key->value)用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号{ }中。
{ 键1:值1, 键2:值2, 键3:值3 ... }
集合(set)是一个无序的不重复元素序列。集合基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或 set( ) 函数创建集合。需要注意的是:创建一个空集合必须用 set( ) 而不是 { },因为 { } 是用来创建一个空字典。
任务1:单词匹配
利用下面给出的字典week编写程序s6A.py。要求:
week={'m': 'Monday','tu': 'Tuesday','w': 'Wensday','th': 'Thursday',
'f': 'Friday','sa': 'Saturday', 'su': 'Sunday'}
1、输入字典的键(不区分大小写),输出键对应的单词。
2、如果输入的键不存在,则显示“ERROR”
3、一轮输入后,询问是否继续
(1)输入y(或Y)继续下一轮输入输出
(2)输入其他退出。
4、程序运行效果:
输入键:M
输出:Monday
"""
(1)通过“键”访问字典(教材P57-59)
字典中各个元素并没有顺序之分,不需要通过位置查找元素。存储元素时进行了优化,使字典的存储和查询效率极高。
通过“键”访问字典,应该将相应的键放到字典名称后面的中括号[ ]里。
>>>week={'m': 'Monday','tu': 'Tuesday','w': 'Wensday'}
>>>week['tu']
'Tuesday'
>>>week['Tu']
KeyError: 'Tu' #错误,键'Tu'不存在。
为了避免引起KeyError异常,访问字典元素时可以先使用in与not in检测某个键是否存在。
s="tu"
if s in week: #判断键s是否存在于字典week中
print(week[s])
else:
print('ERROR')
或:
if s in week.keys( ): #判断键s是否存在于字典week的所有键中
print(week[s])
else:
print('ERROR')
(2)while循环
处理重复的相同任务,一般采用循环结构。以教材P43猜数游戏为例:
import random #导入random模块
print("输入一个1-10以内的数字")
computer= random.randint(1, 10) #生成【1,10】间随机整数
#print(computer)
n=0
while n<3: #①
guess = input("请输入一个数字:")
if computer == int(guess): #猜数与随机数相同
print("恭喜你,猜对了!" )
else:
print("很遗憾,猜错了!")
n+=1
s=input('是否继续?(y-继续,其他退出)')
if s!="y": #②
break
程序中共有两处地方可以退出循环。
① 尝试3次后,n=3,循环条件不成立,自动退出循环。
② 是否继续?选择其他字符后,通过break,强制退出循环。
根据题目要求,只有选择“是否继续”后,才能退出!
可以将尝试次数n调大;或者采用 (while True:)/(while 1:)结构,构成无限循环,通过判断“是否继续?”退出循环。这种方法,在后面的错误和异常处理中,经常采用。
(3)upper( ) 、lower( )、capitalize( )、title( )方法
upper( ):将字符串中字母,小写转换为大写
lower( ):将字符串中字母,大写转换为小写
capitalize( ):将字符串中字母,首字母转换为大写,其余小写
title( ):将字符串中字母,每个单词的首字母转换为大写,其余小写
>>>a = "monday"
>>>a.upper( )
'MONDAY'
>>>b="Tuesday"
>>>b.lower( )
'tuesday'
注意,和教材P24其他字符串方法类似,原有字符串的内容,本身并没有发生变化。
>>>a #a的内容,仍然是原来的'monday'
'monday'
>>>c=a.upper( )
>>>c #变量c和a.upper( ) 的值,都是 'MONDAY'
'MONDAY'
任务2:数值提取
1、调试以下代码,并删除全部注释后保存到s6B.py。
s=input("输入包含数字和空格的字符串:")
a=s.split( ) #用空格分割字符串
a=[x for x in a if x.isnumeric( )] #从列表a中筛选出数字串
a=set(a) #转换为集合,目的:避免元素重复
a=sorted(a,key=int) #对集合元素(数字串)按int函数值递增排序
s=" ".join(a) #将列表a的元素用空格连接成字符串
print(s)
2、按以下要求修改代码,并保存到s6C.py。
(1)提取输入的全部数值(正整数),忽略其他非数字字符。
(2)将提取的数值递增输出(数值不重复)
(3)程序运行效果:
输入:a7d8 11 b15C8 6 3 9 da 6
输出:3 6 7 8 9 11 15
"""
(1)is前缀的方法
isnumeric( ):字符串是否由数字字符组成。
isdigit( ):字符串是否由数字字符组成。
isdecimal( ):字符串是否由十进制字符组成。
这三者区别在于,isnumeric( )针对的是Unicode对象,即Unicode数字、全角数字、罗马数字和汉字数字。
>>>a="1234"
a.isnumeric( )、a.isdigit( )和a.isdecimal( ),三者结果均为True。
>>>a="12三Ⅳ伍"
只有a.isnumeric( )结果为True,其余二者为False。
islower( ):是否由小写字母组成。
isupper( ):是否由大写字母组成。
isspace( ):是否由空白字符组成。
isalnum( ):是否由字母和数字组成。
isalpha( ):是否由字母组成
isinstance( ):判断一个对象是否是一个已知的类型,类似 type( )。
>>> a = 4
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
(2)字符串的遍历
方法①,使用for in遍历字符串。
s="a7d8 11 b15C8"
t=""
for ch in s:
if ch.isdigit( ):
t+=ch
print(t)
#输出:"7811158" #删除非数字字符
方法②,使用range( )遍历字符串。
s="a7d8 11 b15C8"
t=""
for i in range(len(s)):
if s[i] in "0123456789":
continue
t+=s[i]
print(t)
#输出:"ad bC" #删除数字字符
方法①和方法②结合,应该知道实验4中S4E.py,如何将for循环,修改为while循环了!!
m=input("输入一个大于1的正整数:")
i=0
while i<len(m):
if m[i] not in "0123456789":
break
i+=1
列表和元组的遍历,方法和字符串是一样的。
字典的遍历,用前面讲的:for s in week: 或 for s in week.keys( ): ,就可以了。
(3)s6B.py和s6C.py输入输出比较:
s6B.py:
输入:"a7d8 11 b15C8 6 3 9 da 6"
输出:3 6 9 11
① 递增输出;
② 重复的6删除了;
③“a7d8”和“b15C8”中夹杂的数字没有了。
s6C.py:
输入:"a7d8 11 b15C8 6 3 9 da 6"
输出:3 6 7 8 9 11 15
附加练习:
现有一个字典存放学生姓名和三门课程成绩:
s={"张三":[67,88,45],"李四":[97,68,85],"王五":[98,97,95],"赵六":[67,48,45]}
编程计算每个学生的平均成绩和自己三科中的最高分。
程序输出结果:
张三,平均分:66.7,最高分:88
李四,平均分:83.3,最高分:97
王五,平均分:96.7,最高分:98
赵六,平均分:53.3,最高分:67

