1.字典
1.字典的作用
# 定义一个变量保存一个学生的信息
stu = {
'name': '小明',
'gender': '男',
'age': 25,
'height': 140,
'weight': 180,
'score': 90
}
print(stu['name'])
字典和列表的选择问题:
1)同时保存多个意义不同的数据字典(字典保存数据的时候可以通过不同的键来对数据进行区分和说明)
2)同时保存多个意义相同的数据用列表
2.什么是字典(dict)
"""
1)字典是容器型数据类型(能同时保存多个数据),将{}作为容器的标志,里面多个键值对用逗号隔开:{键1:值1, 键2:值2, 键3:值3,...}
2)字典是可变的;字典是无序的(不支持下标操作)
3)字典的元素是键值对
键:键必须是不可变类型的数据(常见不可变类型的数据:字符串、元组、数字、布尔等);键是唯一的
值:任何类型的数据都可以作为字典的值
"""
# 字典无序
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10}) # True
# 空字典
dict = {}
# 键必须是不可变的数据
dict2 = {'a': 10, 20: 30, True: 40, (1, 2): 50} # True
print(dict2) # {'a': 10, 20: 30, True: 40, (1, 2): 50}
# 键是唯一的
dict3 = {'a': 10, 'b':20, 'a':30}
print(dict3) # {'a': 30, 'b': 20}
# 练习:定义变量保存一只狗的信息(名字、性别、年龄、品种、价格)
dog = {
'name': '柴柴',
'gender': '公',
'age': 2,
'variety': '柴犬',
'price': 1000
}
2.字典的增删改查
1.查 - 获取值
# 1)查单个
dog = {
'name': '柴柴',
'gender': '公',
'age': 2,
'variety': '柴犬',
'price': 1000
}
# a.字典[键] - 获取字典中指定键对应的值,如果键不存在会报错
print(dog['age'])
print(dog['name'])
# print(dog['color']) # 报错! KeyError: 'color'
# b.
# 字典.get(键) - 获取字典中指定键对应的值,如果键不存在不会报错并且返回None
# 字典.get(键, 默认值) - 获取字典中指定键对应的值,如果键不存在不会报错返回默认值
print(dog.get('age'))
print(dog.get('name'))
print(dog.get('color')) # None
print(dog.get('age', 1)) # 2
print(dog.get('name', '小狗'))
print(dog.get('color', '白色')) # 白色
# 2)遍历
"""
for 变量 in 字典:
循环体(变量依次取到的是键)
"""
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
for x in dog:
print(x, dog[x])
2.增 - 添加键值对
# 1)字典[键] = 值 - 如果键不存在就添加键值对;如果键存在就修改指定键对应的值
p1 = {'name': '小明', 'age': 18, 'gender': '男'}
# 键不存在的时候添加键值对
p1['height'] = 180
print(p1) # {'name': '小明', 'age': 18, 'gender': '男', 'height': 180}
# 键存在的时候修改键值对
p1['age'] = 28
print(p1) # {'name': '小明', 'age': 28, 'gender': '男', 'height': 180}
# 2)字典.setdefault(键, 值) - 添加键值对(键不存在就添加,存在的时候不会修改)
p1 = {'name': '小明', 'age': 18, 'gender': '男'}
print(p1) # {'name': '小明', 'age': 18, 'gender': '男'}
p1.setdefault('height', 180)
print(p1) # {'name': '小明', 'age': 18, 'gender': '男', 'height': 180}
p1.setdefault('age', 28)
print(p1) # {'name': '小明', 'age': 18, 'gender': '男', 'height': 180}
# 练习:给商品goods_list中所有没有折扣的商品添加折扣对应的键值对,并且折扣值是1
goods_list = [
{'name': '泡面', 'price': 3.5, 'count': 50, 'discount': 0.88},
{'name': '矿泉水', 'price': 2, 'count': 129},
{'name': '火腿肠', 'price': 3, 'count': 32},
{'name': '面包', 'price': 5.5, 'count': 6, 'discount': 0.5},
{'name': '牛奶', 'price': 6, 'count': 21}
]
for x in goods_list:
x.setdefault('discount', 1)
print(goods_list)
3.删 - 删除键值对
# 1)del 字典[键] - 删除指定键对应的键值对
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
print(dog)
del dog['gender']
print(dog) # {'name': '柴柴', 'age': 2, 'variety': '柴犬', 'price': 1000}
# 2)字典.pop(键) - 取出字典中指定键对应的值
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
print(dog) # {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
result = dog.pop('gender')
print(dog, result) #{'name': '柴柴', 'age': 2, 'variety': '柴犬', 'price': 1000} 公
3.生活中的字典
练习:定义一个变量保存一个超市的信息
supermarket = {
'name': '永辉超市',
'address': '肖家河大厦一楼',
'staffs': [
{'name': '张三', 'station': '销售', 'salary': 4000, 'gender': '男', 'age': 32},
{'name': '李四', 'station': '收营员', 'salary': 3000, 'gender': '女', 'age': 25},
{'name': '小明', 'station': '清洁工', 'salary': 3500, 'gender': '男', 'age': 20},
{'name': '小花', 'station': '收营员', 'salary': 3800, 'gender': '女', 'age': 26}
],
'goods_list': [
{'name': '火腿肠', 'price': 2.5, 'count': 109, 'factory': {'name': '双汇', 'tel': '2561712'}},
{'name': '泡面', 'price': 3.5, 'count': 45, 'factory': {'name': '康师傅', 'tel': '828293'}},
{'name': '矿泉水', 'price': 2.0, 'count': 231, 'factory': {'name': '康师傅', 'tel': '828293'}},
{'name': '面包', 'price': 5.5, 'count': 10, 'factory': {'name': '桃李', 'tel': '2819122'}},
{'name': '酱油', 'price': 7.0, 'count': 21, 'factory': {'name': '海天', 'tel': '928181'}},
{'name': '餐巾纸', 'price': 3.0, 'count': 283, 'factory': {'name': '心相印', 'tel': '92101'}},
{'name': '牛奶', 'price': 60.0, 'count': 34, 'factory': {'name': '蒙牛', 'tel': '981012'}}
]
}
# 1. 获取超市名称
print(supermarket['name'])
# 2.获取员工的数量
count = 0
for x in supermarket['staffs']:
count += 1
print(count)
# 方法2
all_staff = supermarket['staffs']
print(len(all_staff))
# 3.打印所有员工的名字
for x in supermarket['staffs']:
print(x['name'])
# 方法2
names = [x['name'] for x in all_staff]
print(names)
# 4. 计算所有员工的平均薪资
s1 = 0
count = 0
for x in supermarket['staffs']:
s = x['salary']
s1 += s
count += 1
print(s1/count)
# 方法2
print(sum([x['salary'] for x in all_staff]) / len(all_staff))
# 5. 计算所有男职员的平均年龄
n1 = 0
count = 0
for x in supermarket['staffs']:
if x['gender'] == '男':
a = x['age']
n1 += a
count += 1
print(n1 // count)
# 方法2
all_man_age = [x['age'] for x in all_staff if x['gender'] == '男']
print(sum(all_man_age) / len(all_man_age))
# 6.打印所有商品的名称
for x in supermarket['goods_list']:
print(x['name'])
# 方法2
all_goods = supermarket['goods_list']
goods_name = [x['name'] for x in all_goods]
print(goods_name)
# 7.统计单价低于5块钱的商品的总量
count1 = 0
for x in supermarket['goods_list']:
if x['price'] < 5:
count1 += 1
print(count1)
# 8.打印所有商品的商家名称
for x in supermarket['goods_list']:
print(x['factory']['name'])
# 方法2
result = [x['factory']['name'] for x in all_goods]
print(result)
4.字典的相关操作
1.相关操作
# 1)字典不支持+、*和比较大小
# 2) in 和 not in
# 键 in 字典 - 判断字典中是否存在指定的键
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
print('name' in dog) # True
print('柴柴' in dog) # False
2.相关函数
# 1)len(字典) - 统计字典中键值对的个数
print(len(dog))
# 2)dict(数据) - 将指定数据转成字典
# 要求:a.数据本身是一个大的序列 b.序列中的每个元素必须是有且只有两个元素的小序列
data1 = ['ab', 'cd', '12']
print(dict(data1)) # {'a': 'b', 'c': 'd', '1': '2'}
data2 = [[10, 20], 'ab', ['name', '张三']]
print(dict(data2)) # {10: 20, 'a': 'b', 'name': '张三'}
data3 = [(10, 20), ('abc', 123), (3, 4), ('age', 45)]
print(dict(data3)) # {10: 20, 'abc': 123, 3: 4, 'age': 45}
# 注意:将字典转换成列表的时候,是直接将字典的键作为列表的元素
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
print(list(dog)) # ['name', 'gender', 'age', 'variety', 'price']
3.相关方法:字典.xxx()
# 1)字典.clear() - 清空字典
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
dog.clear()
print(dog) # {}
# 2)字典.copy() - 赋值字典产生一个一模一样的新字典
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
dog1 = dog.copy()
print(dog1)
dog['name'] = '旺财'
print(dog)
print(dog1)
# 3)
# 字典.items() - 将字典中每一个键值对转换成元组作为新序列中的元素
# 字典.keys() - 获取字典所有的键,返回一个序列
# 字典.values() - 获取字典所有的键,返回一个序列
dog = {'name': '柴柴', 'gender': '公', 'age': 2, 'variety': '柴犬', 'price': 1000}
print(dog.keys()) # dict_keys(['name', 'gender', 'age', 'variety', 'price'])
print(dog.values()) # dict_values(['柴柴', '公', 2, '柴犬', 1000])
print(dog.items()) # dict_items([('name', '柴柴'), ('gender', '公'), ('age', 2), ('variety', '柴犬'), ('price', 1000)])
# 4)字典1.update(字典2) - 将字典2中所有的键值对都添加到字典1中
dict1 = {'a': 10, 'b': 20}
dict2 = {'x': 100, 'y': 200}
dict1.update(dict2)
print(dict1) # {'a': 10, 'b': 20, 'x': 100, 'y': 200}
5.元组和集合
1.元组(tuple)
"""
容器型数据类型;将()作为容器标志,里面多个元素用逗号隔开:(数据1, 数据2, 数据3,...)
不可变的;有序的(元组就是不可变的列表)
任何类型的数据都可以作为元组的元素
"""
x = (10, 20)
print(x, type(x))
nums = (10, 20, 30, 40, 50)
print(nums[0], nums[-1])
print(nums[1:-1:2]) # (20, 40)
t1 = (10, 'abc', True, [10, 20])
2.集合(set)
"""
容器型数据类型;将{}作为容器标志,里面多个元素用逗号隔开:{数据1, 数据2, 数据3,...}
可变的,无序的
集合对元素的要求和字典对键的要求
"""
x = {10, 20}
print(x, type(x))
print({10, 20, 30} == {20, 10, 30}) # True
s1 = {10, 'abc', True, (1, 2), 10, 'abc', 10}
print(s1) # {'abc', 10, (1, 2), True}