python学习第四篇 字典 集合
字典
一.定义:
- 字典是一种可变的容器,可以存储任意类型的数据
- 字典中的每个数据都是用‘键(key)’进行索引的,而不像序列(str,list,tuple)可以用整数进行索引
- 字典的存储是无序的
- 字典中的数据以键(key)-值(value)对形式进行存储
- 字典的键不能重复,且只能用不可变类型做为字典的键
二.创建字典的字面值方式
字典的表示方式以{}括起来,以冒号(:)分隔键值对,各个键值对之间使用逗号分隔开
- 创建空的字典
d = {}
- 创建字典的构造函数dict
dict() #生成一个空的字典等同于{}
dict(iterable) #通过可迭代对象创建一个字典
dict(**kwargs) #关键字传参的形式生成一个字典
注:字典的键必须为不可变类型的值
可变的类型:list(列表),dict(字典),set(集合)
三.字典的基本操作
1.字典的键索引
语法:
字典[键]
作用:
用来获取字典键所对应的值
2.字典添加和修改字典的元素
语法:
字典[键]=值
说明:
键不存在时,创建键,并让键绑定对应的值
键存在时,修改键绑定的值
3.删除字典的元素
del 语句
语法:
del 字典[键]
4.字典的键判断in,not in 运算符
可以用in 运算符判断一个键是否存在于字典中,如果存在返回True, 如果不存在返回False not in与之相反
练习:
写程序实现以下需求:
- 键如下数据形成一个字典seasons
键 值
1 ========>‘春季有1,2,3月’
2 ========>‘夏季有4,5,6月’
3 ========>‘秋季有7,8,9月’
4 ========>‘冬季有10,11,12月’
- 让用户输入一个整数代表这个季节,打印这个季节对应的信息,如果用户输入的信息不存在于字典内,则提示用户信息不存在
1 d={1:'春季有1,2,3月', 2 2:'夏季有4,5,6月', 3 3:'秋季有7,8,9月', 4 4:'冬季有10,11,12月'} 5 print(d) 6 n=int(input("请输入一个整数")) 7 if n in d: 8 print(d[n]) 9 else: 10 print("用户信息不存在")
四.字典的迭代访问
l=input('请输入一段字符串')
d={}
for n in l:
if n not in d:
d[n]=1
else:
d[n]+=1
for k in d:
print(k,':',d[k],'次')
练习:
输入一段字符串,打印出这个字符串中出过的字符以及出现过的次数
如:
输入:abcdabcdaba
打印如下:
a:4次
b:3次
c:2次
d:2次
注:不强调打印顺序
1 l=input('请输入一段字符串') 2 d={} 3 for n in l: 4 if n not in d: 5 d[n]=1 6 else: 7 d[n]+=1 8 for k in d: 9 print(k,':',d[k],'次')
五.可以用于字典的函数
Len(x) max(x) min(x) any(x)
六.字典的内置方法
1.dict.clear()
删除字典中所有的元素
这个方法没有参数没有返回值
2.dict.fromkeys(seq[,value])
创建一个新的字典,以序列seq中的元素作为字典的键,value为字典所有键对应的初始值
参数:
seq – 字典键值列表
value – 可选参数,社会键序列(seq)的值
返回值:
该方法返回一个新的字典
3.dict.get(key,default = None)
返回指定键的值,如果值不在字典中返回默认值None
参数:
Key-字典中要查找的键
Default-如果指定键的值不存在时,返回该默认值返回值
返回值:
返回指定键的值,如果值本在字典中返回默认值None
4.dict.items()
以列表返回可迭代的(键,值)元组
没有参数
返回值:
返回可遍历的(键,值)元组数据
5.dict. keys ()
以列表返回一个字典所有的键
没有参数返回值:
返回一个字典的键
6、dict. update (dict2)
把字典dict2的键/值对更新到dict里
参数:
dict2 添加到指定字典dict里的字典
返回值:
该方法没有任何返回值
7.dict. values ()
以列表返回字典中的所有的值
没有参数
返回值:
返回字典中所有的值。
8.pop (key. [, default])
删除字典给定键key所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值
参数:
key:要删除的键值
default:如果没有key,返回default值。
返回值:
返回值被删除的值。
9、popitem()
随机返回并删除宇典中的对键和值
没有参数
返回值:
返回一个键值对(key, value)形式
七.字典与列表比较
- 都是可变的容器
- 索引方式不同,列表用整数索引,字典用键索引
- 列表的存储是有序的,字典的存储是无序的
- 字典的插入,删除,修改的速度快于列表(重点)
练习:
任意输入很多学生的姓名,年龄,成绩,每个学生的信息存入到字典中,然后再放在列表内每个学生的信息需要手动输入:
如:
请输入姓名:tarena
请输入年龄:15
请输入成绩:99
请输入姓名:china
请输入年龄:70
请输入成绩:98
请输入姓名:<回车>#结束输入
内部存储格式如下:
Infors = [{“name”:”tarena”,”age”:15,”score”:99},{name”:”china”,”age”:70,”score”:98}]
- 打印以上的列表
- 按如下表格打印学生信息
姓名 |
年龄 |
成绩 |
Tarena |
15 |
99 |
China |
70 |
98 |
1 infors=[] 2 while True: 3 d = {} 4 na=input("请输入姓名:") 5 if not na: 6 break 7 d["name"]=na 8 ag=input("请输入年龄:") 9 d["age"]=ag 10 sc=input("请输入成绩:") 11 # d = dict.fromkeys(na,sc) 12 d["score"]=sc 13 infors.append(d) 14 j=1 15 k=0 16 while j<=len(infors)+3: 17 if j==1: 18 print("+-------+-------+-------+") 19 elif j==2: 20 print("| 姓名 | 年龄 | 成绩 |") 21 elif j<len(infors)+3 : 22 dl=infors[k] 23 print("|",dl['name'].center(5),"|",str(dl['age']).center(5),"|",str(dl['score']).center(5),"|") 24 k+=1 25 elif j==len(infors)+3: 26 print("+-------+-------+-------+") 27 j+=1 28 # print(infors) 29 # print("+---------------+----------+----------+") 30 # print("| 姓名 | 年龄 | 成绩 |") 31 # print("+---------------+----------+----------+") 32 # for d in infors: 33 # n = d['name'].center(15) 34 # a = str(d['age']).center(10) 35 # s = str(d['score']).center(10) 36 # print("|%s|%s|%s|" % (n, a, s)) 37 # print("+---------------+----------+----------+")
打印名片管理系统:
要求:
- 添加一个新的名片
- 删除一个名片
- 修改一个名片
- 查询一个名片
- 显示所有名片
- 退出系统
提示:card_infors = [{‘name’:’xx’,’qq’:xxx,’weixin’:xxx,’addr’:’xxx’},
{‘name’:’xx’,’qq’:xxx,’weixin’:xxx,’addr’:’xxx’}
]
1 print("\t\t打印名片系统") 2 l=[] 3 hd="+---------------+----------+----------+----------+" 4 zh="| 姓名 | QQ | 微信 | 地址 |" 5 a=0 6 tt="jkl" 7 while a<=6: 8 k = 0 9 d = {} 10 a = int(input("1.添加 2.删除 3.修改 4.查询 5.显示所有 6.保存信息 7.退出")) 11 if a == 1: 12 na=input("名字:") 13 qq=input("QQ:") 14 wx=input("weixin") 15 ad=input("addr:") 16 d['name']=na 17 d['qq']=qq 18 d['weixin']=wx 19 d['addr']=ad 20 l.append(d) 21 elif a==2: 22 while k==0: 23 i = 0 24 an = input("请输入要删除的名字(可输入jkl返回)") 25 if an==tt: 26 k=1 27 else: 28 for dl in l: 29 if an == dl['name']: 30 l.pop(i) 31 print("删除成功") 32 k = 1 33 else: 34 i += 1 35 if k == 0: 36 print("输入错误名字") 37 elif a==3: 38 while k==0: 39 i = 0 40 d = {} 41 an = input("请输入要修改的名字(可输入jkl返回)") 42 if an==tt: 43 k=1 44 else: 45 for dl in l: 46 if an == dl['name']: 47 na = input("修改后名字:") 48 qq = input("修改后QQ:") 49 wx = input("修改后weixin") 50 ad = input("修改后addr:") 51 d['name'] = na 52 d['qq'] = qq 53 d['weixin'] = wx 54 d['addr'] = ad 55 l[i] = d 56 print(hd) 57 print(zh) 58 print(hd) 59 an = l[i]['name'].center(15) 60 pp = l[i]['qq'].center(10) 61 xw = l[i]['weixin'].center(10) 62 da = l[i]['addr'].center(10) 63 print("|%s|%s|%s|%s|" % (an, pp, xw, da)) 64 print(hd) 65 k = 1 66 else: 67 i += 1 68 if k == 0: 69 print("输入错误名字") 70 elif a==4: 71 while k==0: 72 i = 0 73 a = int(input("请输入要查询的序号(可输入-1退出)")) 74 if a==-1: 75 k=1 76 else: 77 if a <= len(l) + 1: 78 print(hd) 79 print(zh) 80 print(hd) 81 dl = l[a - 1] 82 an = dl['name'].center(15) 83 pp = dl['qq'].center(10) 84 xw = dl['weixin'].center(10) 85 da = dl['addr'].center(10) 86 print("|%s|%s|%s|%s|" % (an, pp, xw, da)) 87 print(hd) 88 k = 1 89 else: 90 print("请输入小于%d的正整数序号", len(l) + 1) 91 elif a==5: 92 print(hd) 93 print(zh) 94 print(hd) 95 for dl in l: 96 an = dl['name'].center(15) 97 pp = dl['qq'].center(10) 98 xw = dl['weixin'].center(10) 99 da = dl['addr'].center(10) 100 print("|%s|%s|%s|%s|" % (an, pp, xw, da)) 101 print(hd) 102 # print(l) 103 elif a==6: 104 f = open('./mingpian.txt', 'w', encoding='utf-8') 105 for dl in l: 106 an = dl['name'].center(15) 107 pp = dl['qq'].center(10) 108 xw = dl['weixin'].center(10) 109 da = dl['addr'].center(10) 110 x=an+pp+xw+da 111 print(x) 112 f.write(x) 113 f.close() 114 elif a==7: 115 break 116 else: 117 print("输入错误,退出") 118 break
集合
集合是可变的序列容器
集合内的数据对象都是唯一的(不能重复多次的)
集合是无序的存储结构,集合中的数据没有先后顺序关系
集合内的元素必须是不可变对象
集合是可迭代对象
集合是相当于只有键没有值的字典
- 创建集合的构造函数
Set() 创建一个空集合对象(不能用{}来创建空集合)
Set(iterable) 用可迭代对象来创建新的集合对象
注:
非空集合用{}括起来,内部的各个元素用(,)分隔开
创建非空集合
集合的添加与删除操作
添加:
- add方法:把要传入的元素做为一个整个添加到集合中
- updata方法:是把要传入的元素拆分,作为个体传入到集合中删除
remove 删除集合中要删除的元素
集合中的查看
集合也是可迭代对象可以用for循环遍历查看其中的元素
集合的运算:
交集& 生成两个集合的交集
并集| 生成两个集合的并集
补集- 生成两个集合的补集
对称补集^ 生成两个集合的对称补集
子集< 判断一个集合是另一个集合的子集
超集> 判断一个集合是另一个集合的超集