字典和集合
一.初始字典
why:目前已经学习了容器型数据类型有list和tuple,list够用吗,有什么缺点
1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢
2.列表只能按照顺序存储,数据与数据之间的关联性不强
所以针对以上的缺点,需要引入另一种容器型的数据类型,解决上面的问题,这就需要dict字典。
what:
数据类型可以按照多种角度进行分类,就跟咱们人一样,人按照地域可以划分分为亚洲人,欧洲人,美洲人等,但是按照肤色又可以分为白种人,黄种人,黑种人,等等,数据类型可以按照不同的角度进行分类,先给大家按照可变与不可变的数据类型的分类:
不可变(可哈希)的数据类型:int,str,bool,tuple。
可变(不可哈希)的数据类型:list,dict,set。
字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的:
Key:不可变(可哈希)的数据类型.并且键是唯一的,不重复的。
Value:任意数据(int,str,bool,tuple,list,dict,set),包括后面要学的实例对象等。
在Python3.5版本(包括此版本)之前,字典是无序的。
在Python3.6版本之后,字典会按照初建字典时的顺序排列(即第一次插入数据的顺序排序
在Python3.7版本之后,有序。
当然,字典也有缺点:他的缺点就是内存消耗巨大。
二.字典的几种创建方法
# 字典
# 方法一:使用list或者tuple来创建
dic = dict([('name', 'huangping'), ('city', 'hangzhou'), ('hobby', ['电脑', '手机'])])
# dic = dict((('name','huangping'),('city','hangzhou'),('hobby',['电脑','手机'])))
print(dic)
# 方法二:
dic = dict(one=1, two=2, three=3)
print(dic)
# 方法三:
dic = dict({'one': 1, 'two': 2, 'three': 3})
# dic = {'one': 1, 'two': 2, 'three': 3}
print(dic)
# 方法四: 后面会讲到先了解
dic = dict(zip(['one', 'two', 'three'],[1, 2, 3]))
print(dic)
# 方法五: 字典推导式 后面会讲到
# dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]}
# print(dic)
# 方式六:利用fromkey后面会讲到。
# dic = dict.fromkeys('abcd','太白')
# print(dic) # {'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
# 不合法
# dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key
# dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
# dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key
三.字典的增删改查
增
#字典的增删改查
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
#方法一:通过键值对直接增加
dic['hobby'] = '上网' #key 存在这是改,不存在则是增加
dic['age'] = 18
print(dic)
结果:
{'name': '黄平', 'city': '杭州', 'age': 18, 'hobby': '上网'}
#方法二:setdefault
dic.setdefault('hobby','shangwang') # key 存在则不变,key不存在则添加,后面的参数为新增的key的value,不写value这默认value为None
print(dic)
dic.setdefault('city','上海')
print(dic)
ret = dic.setdefault('city','上海') # 有返回值
print(ret)
结果:
{'name': '黄平', 'city': '杭州', 'age': 31, 'hobby': 'shangwang'}
{'name': '黄平', 'city': '杭州', 'age': 31, 'hobby': 'shangwang'}
杭州
删
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
#方法一:pop 根据可以删除
dic.pop('age') # 默认情况key 值不存在会报错
ret = dic.pop('hobby','key不存在') #加上第二个参数,key不存在不会报错,会有返回值,key 存在则返回value值
print(ret)
print(dic)
结果:
key不存在
{'name': '黄平', 'city': '杭州'}
#方法二:clear 清空
dic.clear()
print(dic)
结果:
{}
#方法三:del
del dic['name']
print(dic)
del dic #删除整个字典
print(dic)
改
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
dic['name'] = '小白'
print(dic)
结果:
{'name': '小白', 'city': '杭州', 'age': 31}
# update
dic = {'name': '太白', 'age': 18}
dic.update(sex='男', height=175)
print(dic) # {'name': '太白', 'age': 18, 'sex': '男', 'height': 175}
dic = {'name': '太白', 'age': 18}
dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')])
print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
dic1 = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic1.update(dic2)
print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
print(dic2) # {'name': 'alex', 'weight': 75}
查
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
# 通过键值查
print(dic['name']) # 黄平,键值不存在则报错
# 通过get
print(dic.get('name','值不存在')) #键存在,则返回value,键值不存在,如果第二个参数为空值返回None ,不为空则返回参数值
# keys 返回键值
for key in dic.keys():
print(key)
结果:
name
city
age
# values 返回value
for value in dic.values():
print(value)
结果:
黄平
杭州
31
# item 返回key和value
for key,value in dic.items():
print(key,value)
结果:
name 黄平
city 杭州
age 31
相关练习:
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
dic['k4'] = 'v4'
print(dic)
# 请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
dic['k1'] = 'alex'
print(dic)
# 请在k3对应的值中追加一个元素 44,输出修改后的字典
dic['k3'].append(44)
print(dic)
# 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
dic['k3'].insert(0,18)
print(dic)
结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py
{'k1': 'v1', 'k2': 'v2', 'k3': [11, 22, 33], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [11, 22, 33], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [11, 22, 33, 44], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [18, 11, 22, 33, 44], 'k4': 'v4'}
四.字典的嵌套
典的嵌套是非常重要的知识点,这个必须要建立在熟练使用字典的增删改查的基础上,而且字典的嵌套才是咱们在工作中经常会遇到的字典,工作中遇到的字典不是简简单单一层,而就像是葱头一样,一层接一层,但一般都是很有规律的嵌套,那么接下来我们就学习一下字典的嵌套:
dic = {
'name':'汪峰',
'age':48,
'wife':[{'name':'国际章','age':38}],
'children':{'girl_first':'小苹果','girl_second':'小怡','girl_three':'顶顶'}
}
# 1. 获取汪峰的名字。
print(dic['name'])
# 2.获取这个字典:{'name':'国际章','age':38}。
print(dic['wife'][0])
# 3. 获取汪峰妻子的名字。
print(dic['wife'][0]['name'])
# 4. 获取汪峰的第三个孩子名字。
print(dic['children']['girl_three'])
结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py
汪峰
{'name': '国际章', 'age': 38}
国际章
顶顶
练习:
dic1 = {
'name':['alex',2,3,5],
'job':'teacher',
'oldboy':{'alex':['python1','python2',100]}
}
# 1,将name对应的列表追加⼀个元素’wusir’。
dic1['name'].append('wusir')
print(dic1)
# 2,将name对应的列表中的alex⾸字⺟⼤写。
dic1['name'][0] = dic1['name'][0].title()
print(dic1)
# 3,oldboy对应的字典加⼀个键值对’⽼男孩’,’linux’。
dic1['oldboy']['老男孩'] = 'linux'
print(dic1)
# 4,将oldboy对应的字典中的alex对应的列表中的python2删除
dic1['oldboy']['alex'].remove('python2')
print(dic1)
结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py
{'name': ['alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100], '老男孩': 'linux'}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 100], '老男孩': 'linux'}}
# 有字符串 "k: 1|k1:2|K2:3 | k3 :4 处理成字典{'k':1,'k1':2...} msg = 'k: 1|k1:2|K2:3 | k3 :4' lis = msg.split('|') dic = {} for i in lis: key,value = i.split(':') dic[key.strip()] = value.strip() print(dic) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {'k': '1', 'k1': '2', 'K2': '3', 'k3': '4'}
# v = {} # for index in range(10): # v['users'] = index # print(v) # {'users':9} # 商品列表: # goods = [ # {"name": "电脑", "price": 1999}, # {"name": "鼠标", "price": 10}, # {"name": "游艇", "price": 20}, # {"name": "美女", "price": 998} # ] # 需求: # 1.页面显示 序号 + 商品名称 + 商品价格,如: # 1 电脑 1999 # 2 鼠标 10 # ... # 2.用户输入选择的商品序号,然后打印商品的名称及商品价格 # 3.如果用户输入的商品序号有误,则提示输入有误,并重新输入 # 4.用户输入Q或者q,退出程序 goods = [ {"name": "电脑", "price": 1999}, {"name": "鼠标", "price": 10}, {"name": "游艇", "price": 20}, {"name": "美女", "price": 998} ] while 1: # for index in range(len(goods)): # print('{}\t{}\t{}'.format(index + 1, goods[index]['name'], goods[index]['price'])) """ 或者 使用enumerate方法 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中 """ for index,dic in enumerate(goods,start=1): print('{}\t{}\t{}'.format(index,dic['name'],dic['price'])) choice_num = input("请输入商品序号(Q/r退出):").strip() if choice_num.isdecimal(): if 0 < int(choice_num) <= len(goods): print("你输入的商品名称为{},价格为{}".format(goods[int(choice_num) - 1]['name'], goods[int(choice_num) - 1]['price'])) else: print("你输入超出范围,请重新输入") elif choice_num.upper() == 'Q': break else: print("输入非字母元素,请重新输入")
五、集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可以变类型),但是集合本身是不可哈希的(所以集合不能作为字典的键。
集合的两个重点:
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据之间的交集、差集、并集等关系
1.集合的创建
set1 = set({1,2,'aaa'}) set2 = {1,2,'aaa'} print(set1,type(set1)) print(set2,type(set1)) set3 = set() #创建空集合 dit = {} #创建空字典 print(set3,type(set3)) print(dit,type(dit))
结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {1, 2, 'aaa'} <class 'set'> {1, 2, 'aaa'} <class 'set'> set() <class 'set'> {} <class 'dict'>
set1 = {1,2,'ccc',3,'aaa',1,1,22,3}
print(set1) #去重且无序
结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py
{1, 2, 3, 22, 'ccc', 'aaa'}
2.集合的增
set1 = {1,2,3,'aaaa'} set1.add('bbb') print(set1) #update:迭代着增加 set1.update('A') print(set1) set1.update('老师') print(set1) set1.update(['c','d','e']) print(set1) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {1, 2, 3, 'bbb', 'aaaa'} {1, 2, 3, 'bbb', 'aaaa', 'A'} {1, 2, 3, '老', 'bbb', 'aaaa', '师', 'A'} {1, 2, 3, 'e', '老', 'c', 'bbb', 'aaaa', '师', 'A', 'd'}
3.集合的删除
set1 = {1,2,3,'aaaa'} set1.remove(1) #删除一个元素 print(set1) set1.pop() #随机删除一个元素 print(set1) set1.clear() #情况集合 print(set1) del set1 #删除集合 print(set1) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {'aaaa', 2, 3} {2, 3} set() Traceback (most recent call last): File "D:\pythonProject\python3\day10\s1.py", line 13, in <module> print(set1) NameError: name 'set1' is not defined. Did you mean: 'set'? Process finished with exit code 1
4.集合的改
集合不支持直接改动,可以先删除后增加来实现改的操作
5.集合的其他操作
5.1 交集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) print(set1.intersection(set2)) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {4, 5} {4, 5}
5.2 并集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) print(set1.union(set2)) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {1, 2, 3, 4, 5, 6, 7, 8} {1, 2, 3, 4, 5, 6, 7, 8}
5.3 差集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) print(set1.difference(set2)) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {1, 2, 3} {1, 2, 3}
5.4 反交集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) print(set1.symmetric_difference(set2)) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {1, 2, 3, 6, 7, 8} {1, 2, 3, 6, 7, 8}
5.5 子集与超集
set1 = {1,2,3} set2 = {1,2,3,4,5} print(set1 < set2) print(set1.issubset(set2)) #这两个都是True说明,set1是set2的子集 print(set2 > set1) print(set2.issuperset(set1)) #这两个都是True说明,set2是set1的超集集 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py True True True True
5.6 frozenset不可变集合,让集合变成不可变类型。
s = frozenset('barry') print(s,type(s)) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py frozenset({'b', 'r', 'a', 'y'}) <class 'frozenset'>
六、enumerate
enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
l1 = ['a','v','c'] for i in enumerate(l1): print(i) for index,val in enumerate(l1,start=1): print(index,val) 结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py (0, 'a') (1, 'v') (2, 'c') 1 a 2 v 3 c
练习题:
cars = ['鲁A4546','鲁B12565','京B8888','黑C6666','黑C4444','沪B34252','鄂A7777'] lolcals = {'沪':'上海','黑':'黑龙江','鲁':'山东','鄂':'湖北','湘':'湖南','京':'北京'} dic = {} # 结果:{'黑龙江':2,'山东':1,'北京':1} # 方法一: # for i in cars: # if i[0] in dic.keys(): # dic[i[0]] += 1 # else: # dic[i[0]] = 1 # print(dic) # # 方法二: # for i in cars: # dic[i[0]] = dic.get(i[0],0) + 1 # print(dic)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构