一. 字典
1. 字典的作用:
- 场景:定义一个变量保存一个学生的信息
stu = ['小明', '男', 170, 60, 80, 22, 66, 30]
用列表的话,数据意义不明。
### 字典写法会更加清晰
student = {'name':'小明', 'gender':'男','height':170, 'weight':60, '数学':80, '语文':22, '英语':66, 'age': 30}
print(student['name'])
2. 列表和字典的选择:
- 列表和字典都可以保存多个数据,如果需要保存多个数据的意义不同就使用字典
- 如果同时保存的多个数据的意义相同就用列表
3. 字典的定义
- 字典是容器型数据类型;将{ }作为容器的标志,里面多个键值对用逗号隔开:
{键1:值1,键2:值2,键3:值3, .....}
- 字典是可变的(支持增删改),字典是无序的(顺序不影响结果,不支持索引操作)
- 字典对元素的要求
- 字典中的元素必须全部是键值对,键值对必须成对出现
- 键的要求: 键必须是不可变类型数据,一般为字符串。 键是唯一的
- 值的要求: 没有要求
dict1 = {} #空字典
print({'a':10, 'b':20} == {'b':20, 'a':10}) #字典是无序的 True
#键必须是不可变类型的数据
dict2 = {10:1 , 'a':2 , True:3 }
#键是唯一的
dict3 = {'a':10 , 'a':20 , 'b':30 }
print(dict3) #{'a': 20, 'b': 30}
4. 字典的操作
-
查(获取字典的值)
a. 字典[ 键 ] ---- 获取字典中指定键对应的值
dog = { 'name':'土豆', 'age':3, 'gender':'man'}
print(dog['name'])
### 键要不存在 程序会报错 keyerror
b. 字典.get(键) ---- 获取字典中指定键对应的值
dog = {'name':'土豆', 'age':3, 'gender':'man'}
print(dog.get('name'))
## 如果键不存在,不会报错 默认返回None
c. 字典.get(键, 默认值)。---- 获取字典中指定键对应的值,如果键不存在程序不会报错而是返回默认值。
### 如果键不存在,这样书写的话,会输入‘不存在’
dog = {'name':'土豆', 'age':3, 'gender':'man'}
print(dog.get('type','不存在'))
二. 实际开发中的字典
案例: 定义一个变量保存一个班级信息(实际操作)
class1 = {
'name': 'SH-python2303',
'position': '1教',
'head_teacher': {'name': '曹老板', 'tel': '110', 'gender': '男'},
'lecturer': {'name': '余婷', 'tel': '120', 'gender': '女'},
'students': [
{'name': 'stu1', 'age': 19, 'gender': '男', 'score': 98, 'link_man': {'name': '张三', 'tel': '19283832'}},
{'name': 'stu2', 'age': 24, 'gender': '女', 'score': 89, 'link_man': {'name': '李四', 'tel': '22349911'}},
{'name': 'stu3', 'age': 25, 'gender': '女', 'score': 54, 'link_man': {'name': '王五', 'tel': '19292811'}},
{'name': 'stu4', 'age': 30, 'gender': '男', 'score': 66, 'link_man': {'name': '赵六', 'tel': '82791262'}},
{'name': 'stu5', 'age': 17, 'gender': '男', 'score': 77, 'link_man': {'name': '小红', 'tel': '771723831'}},
{'name': 'stu6', 'age': 16, 'gender': '女', 'score': 91, 'link_man': {'name': '小明', 'tel': '191023311'}},
{'name': 'stu7', 'age': 25, 'gender': '男', 'score': 59, 'link_man': {'name': '老王', 'tel': '1991888118'}},
]
}
# 1) 获取班级名称
result1 = class1['name']
print(result1)
# 2) 获取班主任的名字和电话
head_teacher = class1['head_teacher']
print(head_teacher['name'],head_teacher['tel'])
# 3) 获取讲师的名字和性别
lecturer = class1['lecturer']
print(lecturer['name'],lecturer['gender'])
# 4) 获取所有学生的名字
all_student = class1['students']
print(all_student)
for stu in all_student:
print(stu['name'])
# 5) 获取所有男生的年龄
result5 = [ i['age'] for i in class1['students'] if i['gender'] =='男' ]
print(result5)
print('**************************************************************************')
# 6) 计算所有女生的平均分
girl_scores = [stu['score'] for stu in class1['students'] if stu['gender']=='女']
print(girl_scores)
print(sum(girl_scores)/len(girl_scores))
print('**************************************************************************')
# 7)获取所有学生的联系人电话号码
tels = [stu['link_man']['tel'] for stu in class1['students']]
print(tels)
三. 字典的遍历
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
for i in dog:
print('i:', i,dog[i])
'''
i: name 土豆
i: age 19
i: gender 公
i: type 泰迪
'''
四. 字典的增删改
1. 增 ---- 增加键值对
- 字典[ 键 ] = 值 如果键不存在,就添加键值对。 如果键存在,就修改指定键对应的值
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
# 原字典
print('dog')
#添加元素
dog['color'] = '黄色'
print(dog)
#修改字典的元素
dog['name']='可乐'
print(dog)
- 字典.setdefault(键, 值) ----- 在字典中添加键值对(如果键已经存在不会修改指定键对应的值)
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
### 键不存在 新加入
dog.setdefault('color','黄色')
print(dog)
### 键已经存在,不会改变
dog.setdefault('name','可乐')
print(dog)
练习# 一个商品列表,写程序给没有折扣的商品添加折扣对应的键值对
goods_list = [
{'name': '泡面', 'price': 3.5, 'count': 19, 'discount': 0.8},
{'name': '矿泉水', 'price': 1.5, 'count': 70},
{'name': '面包', 'price': 7.5, 'count': 5, 'discount': 0.5},
{'name': '火腿肠', 'price': 2.5, 'count': 9}
]
for item in goods_list:
item.setdefault('discount',1)
print(goods_list)
2. 删 ----- 删除键值对
- del 字典[ 键 ]
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
del dog['age']
print(dog)
#{'name': '土豆', 'gender': '公', 'type': '泰迪'}
- 字典.pop (键) ---- 取走字典指定键对应的值,并且返回值
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(dog)
result = dog.pop('gender') ## 公
print(dog, result) # {'name': '土豆', 'age': 19, 'type': '泰迪'} 公
五. 字典的相关操作、函数、方法
1. 字典不支持 + 、* 和 < 、 >、 <= 、 >=
-
in 和 not in
判读字典中是否存在指定的键
2. 字典的相关函数:len 、 dict
- len(字典)
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(len(dog))
# 4
- dict (数据) --- 将指定数据转换为字典
对数据的要求: a. 数据本身必须是一个容器
b. 容器中的每个元素必须长度为2 的小容器
c. 小容器中的第一个元素必须是不可变类型数据
d1 = ['ab', 'cd', 'ef']
d2 = ['ab', range(2)]
# 本身都是容器, 容器每个元素长度都为2 , 且第一个元素都是不可变
3. 字典的相关方法:
a. 字典.clear( ) - 清空字典
dog.clear()
b. 字典.copy() - 复制字典 创建一个一模一样的新字典
dog2 = dog.copy()
c. 字典.keys( ) 、 字典.values( ) 、 字典.items( )
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(dog.keys()) #dict_keys(['name', 'age', 'gender', 'type'])
print(dog.values()) #dict_values(['土豆', 19, '公', '泰迪'])
print(dog.items()) #dict_items([('name', '土豆'), ('age', 19), ('gender', '公'), ('type', '泰迪')])
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
for key, value in dog.items():
print(key,value)
d. 字典1.update(字典2)
- 将字典2中所有键值对都添加到字典1中
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
dog.update({'a':10,'b':20})
print(dog)
#{'name': '土豆', 'age': 19, 'gender': '公', 'type': '泰迪', 'a': 10, 'b': 20}
e. 字典推导式
- { 表达式1: 表达式2 for 变量 in 容器 }
- { 表达式1: 表达式2 for 变量 in 容器 if 条件语句 }
练习:利用字典推导式交换字典中键和值的位置
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
#way1
dog_lst = { v:k for k,v in dog.items() }
print(dog_lst)
#way2
dict1 = {dog[x]:x for x in dog}
print('dict1:', dict1)
六. 元组
1. 元组的定义:
- 是一种容器
- 将( ) 作为容器的标志,里面多个元素用逗号隔开 : ( 数据1, 数据2, 数据3, ....... )
- 元组是不可变列表(不支持增删改)
- 元组是有序的(顺序影响结果,支持索引操作)
2.元组类型
- 空元组 t1 = ()
- 只有一个元素元组(唯一元素后必须加逗号) t2 = (10, ) print(t2,type(t2))
- 在没有歧义的情况下,元组的 ( )可以省略 ---- 直接多个数据用逗号隔开表示的也是一个元组
-
t10 = 1,2,3,4*10 print(type(t10)) #<class 'tuple'>
3. 元组的操作
a. 查 - 获取元组的元素
- 元组获取元素的方式和列表一样
movie = ('三傻大闹宝莱坞', '触不可及', '教父','变行金刚','盗梦空间','奥本海默')
print(movie[1],movie[-1],movie[-2])
print(movie[1:-1])
print(movie[0:-2:2])
print('**************************************************************************')
for i in movie:
print(i)
print('**************************************************************************')
for index in range(len(movie)):
print(index,movie[index])
b.通过多变量的方式获取元组或者列表中的元素
让变量的个数和元组/列表中元素的个数保持一致
point = (10,20,30)
x,y,z = point
print(x,y,z)
a,b,c = 100,200,300
d1 = {'a':10, 'b':20,'c':30}
for k,v in d1.items():
print(k,v)
lst = [(10,20,30),('a','b','c'),('abc',100,200)]
for x1,x2,x3 in lst:
print(x1,x2,x3)
c.当变量的个数小于元组/列表中元素的个数
在其中一个变量前面加*。取得时候先让不带*的变量去获取元素,剩下的全部给带*的变量
point =(10,20,30,40,50)
*x,y,z =point
print(y)
'''
y 是40, z是50. 其余的全部给x
'''
point =(10,20,30,40,50)
x,*y,z =point
'''
x = 10, z =50 , 其余给y
'''