01 认识字典
1.字典的作用
- 需求: 定义一个变量保存一个学生的信息
stu = ['小明', 32, '电子信息', 170, 80, 90]
print(stu[1])
stu = {
'name': '小明',
'age': '32',
'专业': '电子信息',
'height': 170,
'weight': 80,
'score': 90
}
print(stu['age'])
2.字典和列表的选择
- 如果要保存多个意义不同的数据,就使用字典;
- 要保存多个意义相同的数据就用列表
3.什么是字典(dict)
- 字典是系统类型,属于容器型数据类型(序列);
- 将{}作为容器的标志,里面多个键值对(元素)用逗号隔开: {键1:值1, 键2:值2, 键3:值3, …}
- 特点:
a. 字典是可变(支持增删改);
b. 字典是无序的(不支持下标操作;顺序不影响结果) - 键值对:
a. 键 - 键必须是不可变类型的数据(数字、字符串、布尔、空值、元组); 键唯一(同一字典中同一个键只能出现一次)
b. 值 - 没有要求(任何类型的数据)
# 字典无序
print({'a': 10,'b': 20} == {'b': 20, 'a': 10}) # True
# 值不可变
dict1 = {10: 20, 'a': 30, (10, 20): 40}
# dict2 = {10: 20, 'a': 30, [10, 20]: 40} 报错
# 键唯一
dic3 = {'a': 10, 'b': 20, 'a': 30}
print(dic3) # {'a': 30, 'b': 20}
# 空字典
dict4 = {}
02 字典的查操作
字典存储数据真正想要保存的是值,键至少用来对值进行区分和说明的(相当于列表中元素的下标)
1. 查单个 - 获取单个值
1) 字典[键]
- 获取字典中指定键对应的值,如果键不存在程序会报错
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog['type'])
print(dog['name'])
# print(dog['weight']) # KeyError: 'weight'
2) 字典.get(键)
- 获取字典指定键对应的值,如果键不存在不会报错并且会返回空值(None)
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog.get('color'))
print(dog.get('price'))
print(dog.get('weight')) # None
3) 字典.get(键, 默认值)
- 获取字典中指定键对应的值,如果键不存在不会报错并且会返回默认值
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog.get('age', 0)) # 3
print(dog.get('weight', 10)) # 10
2.生活中的列表和字典
需求: 结合实际定义一个变量保存一个班级的信息
班级信息: 班级名、教室、讲师、班主任、学生
class1 = {
'className': 'Python2205',
'classRoom': '11教',
'lecturer': {'name': '余婷', 'age': 18, 'tel': '13678192302', 'gender': '女'},
'classTeacher': {'name': '燕子姐', 'age': 18, 'tel': '119', 'QQ': '8282821'},
'students': [
{'name': 'stu1', 'age': 19, 'tel': '1922333', 'gender': '男', 'linkman': {'name': '张三', 'tel': '11923'}},
{'name': 'stu2', 'age': 28, 'tel': '8727832', 'gender': '男', 'linkman': {'name': '小明', 'tel': '19202'}},
{'name': 'stu3', 'age': 30, 'tel': '291912', 'gender': '女', 'linkman': {'name': '李四', 'tel': '1910283'}},
{'name': 'stu4', 'age': 17, 'tel': '2349183', 'gender': '男', 'linkman': {'name': '老王', 'tel': '109221567'}},
{'name': 'stu5', 'age': 16, 'tel': '27273482', 'gender': '女', 'linkman': {'name': '王五', 'tel': '119283427'}},
{'name': 'stu6', 'age': 22, 'tel': '1242402', 'gender': '男', 'linkman': {'name': '赵六', 'tel': '2091834'}}
]
}
# 1)获取班级名称
print(class1['className'])
# 2)获取讲师的名字和电话
print(class1['lecturer']['name'], class1['lecturer']['tel'])
# 3)获取班主任的名字和QQ
print(class1['classTeacher']['name'], class1['classTeacher']['QQ'])
# 4)打印所有学生的名字
# for i in class1['students']:
# print(i['name'])
result = [i['name'] for i in class1['students']]
print(result)
# 5)计算所有男人的平均年龄
total_age = count = 0
for stu in class1['students']:
if stu['gender'] == '男':
total_age += stu['age']
count += 1
print('男生的平均年龄:', total_age / count)
# 6)打印所有女学生的联系人的电话
for i in class1['students']:
if i['gender'] == '女':
print(i['linkman']['tel'])
3.遍历字典 - 一个一个的获取字典所有的值
方法1:
for 变量 in 字典:
循环体(变量获取到的是字典的键)
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
for i in dog:
print(i, dog[i])
方法2:
for 变量1, 变量2 in 字典.item():
循环体(变量1依次取到的是所有的键,变量2依次取到的是所有的值)
for key, value in dog.items():
print(key, value)
03 字典的增删改操作
1.增(添加键值对)、改(修改某个键对应的值)
1) 字典[键] = 值
- 如果键不存在就添加键值对; 如果键存在就修改键对应的值
stu = {'name': '小明', 'age': 18, 'height': 177}
print(stu)
# 添加'weight': 70
stu['weight'] = 70
print(stu) # {'name': '小明', 'age': 18, 'height': 177, 'weight': 70}
# 修改'age': 28
stu['age'] = 28
print(stu) # {'name': '小明', 'age': 28, 'height': 177, 'weight': 70}
2) 字典.setdefault(键, 值)
- 添加键值对(只会在键不存在的时候实现添加的功能,键存在无作为)
stu = {'name': '小明', 'age': 18, 'height': 177}
stu.setdefault('weight', 80)
print(stu)
stu.setdefault('age', 30)
print(stu)
# 给没有折扣的商品添加折扣值为1
goods = [
{'name': '火腿肠', 'price': 1.5, 'count': 53, 'discount': 0.9},
{'name': '泡面', 'price': 3.5, 'count ': 100},
{'name': '矿泉水', 'price': 1, 'count': 135},
{'name': '面包', 'price': 5.5, 'count': 10, 'discount': 0.75}
]
for i in goods:
i.setdefault('discount', 1)
print(goods)
2. 删 - 删除键值对
1) del 字典[键]
- 删除指定键对应的键值对
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
del stu['height']
print(stu) # {'name': '小明', 'age': 18, 'gender': '男'}
2) 字典.pop(键)
- 取出字典中指定键对应值,并且返回
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
result = stu.pop('gender')
print(stu, result) # {'name': '小明', 'age': 18, 'height': 177} 男
04 字典的相关操作和函数
1. 字典不支持+、*和比较大小,只支持比较是否相等
2. in和not in
- 判断字典中是否存在指定键
# 键 in 字典
# 键 not in 字典
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(3 in dog) # False
print('name' in dog) # True
3. len
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(len(dog)) # 5
4. dict
- dict(数据) - 将指定数据转换成字典
数据的要求:
1) 数据本身是一个序列;
2) 大序列中的每个元素是有且只有两个元素的小序列,并且小序列中的第一个元素是不可变类型的数据。
data1 = ['ab', [10, 20], '10']
print(dict(data1))
data1 = [('age', 20), ('name', '张三'), ('gender', '男')]
print(dict(data1)) # {'age': 20, 'name': '张三', 'gender': '男'}
05 字典的相关方法
字典.xxx()
1. 字典.clear() - 清空字典
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog.clear()
print(dog)
2. 字典.copy()
- 复制字典产生一个一模一样的新字典,并且将新的字典返回
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog1 = dog.copy()
print(dog1)
3.keys/values/items
- 字典.keys() - 获取字典所有的键并且返回
- 字典.values() - 获取字典所有的值
- 字典.items() - 将字典中的每个键值对转换成一个一个的元组作为序列中的元素返回
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog.keys()) # dict_keys(['name', 'age', 'type', 'price', 'color'])
print(dog.values()) # dict_values(['旺财', 3, '土狗', 30000, '黄色'])
print(dog.items()) # dict_items([('name', '旺财'), ('age', 3), ('type', '土狗'), ('price', 30000), ('color', '黄色')])
4. 字典1.update(字典2)
- 将字典2中的键值对全部添加到字典1中
- 如果字典2中有与字典1重复的键值对,会直接覆盖该键值对
dog.update({'a': 10, 'b': 20, 'age': 10})
print(dog) # {'name': '旺财', 'age': 10, 'type': '土狗', 'price': 30000, 'color': '黄色', 'a': 10, 'b': 20}