总结:
1.集合和集合的运算
2.字典和字典的运算及函数
3.集合和字典的应用
一、集合
- 集合是一类容器,元素没有先后顺序,并且元素的值不重复。
- 集合的字面量用花括号{}
{1,5,7}
{‘apple’,‘orange’,‘pear’,‘banana’}
创建集合:
- 直接给变量赋值一个集合字面量
fruit = {‘apple’,‘orange’,‘pear’,‘banana’} - 使用 set()创建一个空集合
emp = set()
注:emp={} #创建一个空字典 - 使用set()将列表或者元组转换成集合
prime = set([1,3,5,7,11])
结果是:
{1,3,5,7,11} - 集合的值不重复
创建集合的时候,python会消除重复的值。
fruit ={‘apple’,‘orange’,‘apple’,‘pear’,‘orange’,‘banana’}
结果是:
{‘apple’,‘pear’,‘banana’,‘orange’}
创建和访问集合的元素:
- 可以用add()和remove()添加和删除集合元素
- 可以用min()、max()、len()和sum()对集合操作。
- 集合内的元素是无序的,所以不能像列表那样通过下标来访问集合元素。
元素、子集、超集和相等判断:
- 如果集合s1中的元素,同样都在集合s2中,则称s1为s2的子集,s2为s1的超集。
- 使用s1.issubset(s2)来判断s1是否为s2的子集。
- 使用s2.issuperset(s1)来判断s1是否为s2的超集。
s1={2,3,5,7}
s2={1,2,3,4,5,6,7}
print(s1.issubset(s2))
print(s2.issuperset(s1))
输出:
True
True
使用关系运算符<,<=,>,>=。
- 如果s1是s2的真子集,则s1<s2是True
- 如果s1是s2的子集,则s1<=s2是True
- 如果s1是s2的真超集,则s1>s2是True
- 如果s1是s2的超集,则s1>=s2是True
- 注:s1是s2的真子集的意思是s1是s2的子集,但是s2中至少有一个s1中不存在的元
素;s1是s2的真超集的意思是s1是s2的超集,但是s1中至少有 一个s2中不存在的元
素。
集合运算:
通过集合的函数或者运算符进行集合的并集、交集、差集和对称集的集合运算。
假设2个集合:s1={2,3,5,7,11},s2={2,3,4,5,6,7},下列给出4种集合运算的示例。
二、字典
- 字典是一个用“键”做索引来存储数据的集合。一个键和它所对应的数据形成字典中的一个条目。
创建字典:
- 用花括号{}来表示,每个元素用冒号分隔键和数据。
students={3180101:‘张三’,3180102:‘李四’,3180105:‘王五’,3180110:‘赵六’} - 可以用{}或者dict()来创建空字典。
用dict()创建字典:
>>>fac=dict([("math","0001"),("python","0002"),("c","0003")])
>>>fac
{'math':'0001','python':'00O2','c':'0003'}
>>>fac=dict(math="0001",python="0002",c="0003")
>>>fac
{'math':'0001,'python':'0O02','c':'0003'}
注意:后一种方式要用标识符
字典的键:
- 不可变对象可作为字典的键,如数字,字符串,元组
- 可变对象不可以作为字典的键,如:列表,字典等
字典的基本运算:
- 访问和修改条目
直接用[]运算符,用<字典>[键]的形式,访问
键所对应的数据。
score = {'张三':78,'李四':92}
print(score['张三']) #访问score中键为'张三'的数据
score['李四']=89 #把score中键为'李四'的数据修改为89
score['王五']=100 #score中没有键为'王五'的元素,则增加一项,键为'王五',数据为100。
print(score)
输出:
78
{'张三':78,'李四':89,'王五':100}
- 删除条目
用del语句,删除指定键的字典条目。
del score[‘张三’]
注:如果指定键不存在,则会抛出KeyError异常。 - 遍历字典
使用循环语句实现
score = {'张三':78,'李四':92,'王五':89}
for name in score:
print(name+':'+str(score[name]))
输出:
张三:78
李四:92
王五:89
- 字典大小
用函数len()得到字典的条目的数量。
len(score) - 检测
用int和not in运算符检测一个键是否在字典中存在。
score = {'张三':78,'李四':92,'王五':89}
print('李四' in score)
print('小白' in score)
输出:
True
False
常见的字典方法:
说明:
- 函数get()和运算符[]不同之处,在于如果键key在字典中不存在,则get(key)返回None值,而运算符[]会抛出KeyError异常。
- 函数keys()、values()和items()都是返回一个序列。由于字典中键不重复,所以keys()和items()的返回结果可以转换成元组;而values()返回值由于可能存在重复值,应该转换为列表。
score = {'张三':78,'李四':92,'王五':92}
v=list(score.values())
print(v)
[78,92,92]
- 用items()实现字典遍历
score = {'张三':78,'李四':92,'王五':89}
for key,value in score.items():
print(key + ':'+str(value))
张三:78
李四:92
王五:89
- 用字典计数
输入一行字符,求字符"a","b"和"c"出现的次数
diccount={char:0 for char in "abc"}#字典初始化
s=input()
lst=[char for char in s if
ord("a")<=ord(char)<=ord("c")]
for char in lst:
diccount[char]+=1
print(diccount)
三、集合和字典的应用
- 集合和字典是非常有用的容器,善用它们往往可以事半功倍。
- 处理学生成绩
输入:(以END结束)
学生的学号,姓名
学生的学号,课程,成绩
输出:
表头 学号,姓名,课程1,课程2,…平均分
内容 <学号>,<姓名>,<成绩1>,<成绩2>,…, <平均分>
- 字典:
studentid,键是学号,值是姓名。
score,键是课程,值是成绩
studentscore,键是学号,值是字典score。 - 集合course, 课程
过程:
输入数据:
- 不断循环地读入每一行,如果读入的是END,则循环结束。
- 如果是学号、姓名关系,那么第一个字特串应该都是数字,而如果是成绩,应该最后一个
字符串是数字。
while True:
line = input()
if line = 'END':
break
words = line.split() #以空格分割输入行
if words[-1].isnumeric(): #最后的字符串是数字
...
else:
...
- 如果输入的是学号姓名关系:加入studentid字典:
studentid[words[0]]=words[1] - 如果输入的是成绩: 要把课程、成绩关系加入到那个学号所对应的学生的成绩字典里。
- 如果那个学生之前还没有输入过成绩,还要新建那个字典:
score = studentscore.get(word[0])
if score == None:
score = {}
score[words[1]]=words[2]
studentscore[word[0]] = score
- 同时还需要把这门课程的名字加入课程的集合:
course.add(words[1])
输出数据:
- 首先要输出表头
coursename = list(course)
print(',',end='')
for name in coursename:
print(','+name,end'')
print()
- 然后要遍历学号、姓名字典,找出所有的学号和姓名,同时找出每个学生的所有成绩
for id in studentid.keys():
print(id+','+studentis[id],end='')
score = studentscore[id]
sum=0
cnt=0
for name in coursename:
print(',',end='')
if name in score:
print(score[name],end='')
sum + =int(score[name])
cnt + = 1
print(','+str(int(sum/cnt)))
各种数据类型汇总:
本章小结
- 集合和字典是两种数据容器。
- 集合中没有重复的数据,数据没有位置和顺序,不能用索引来存取。集合可以做交、并、差等运算。
- 字典是用键来存取数据的,数字、字符串和元组都可以作为键。键所对应的值可以是任何类型,数字、字符串甚至列表和字典都可以作为值存放在字典中。
版权声明:本文为weixin_45994391原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。