总结
1.字典
-
什么是字典(dict)
-
字典是容器型数据类型(序列),将{}作为容器的标志,里面多个元素用逗号隔开(每个元素必须是键值对):{键1:值1,键2:值2,…}
-
字典是可变的(支持增删改);字典是无序的
-
键 - 必须是不可变的数据才可以作为字典的键(数字,字符串,元组);键是唯一的
-
值 - 值才是字典真正想要保存的数据,键的作用就像列表中的下标用来对值进行区分和说明的。值可以是任何类型的数据,可以重复
dict1 = {'name': '小明', 'sex': '男'} print(list(dict1)) # ['name', 'sex'] print(tuple(dict1)) # ('name', 'sex') print(set(dict1)) # {'sex', 'name'} for x in dict1: print(x) # name sex
-
-
字典的注意事项
-
空字典
dict2 = {} print(dict2, type(dict2), len(dict2)) # {} <class 'dict'> 0
-
字典无序
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10}) # True(字典无序)
-
键是不可变
print({10: 20, 'abc': 100, (1, 2): 300}) # {10: 20, 'abc': 100, (1, 2): 300} # print({10: 20, 'abc': 100, [1, 2]: 300}) # TypeError: unhashable type: 'list'
-
键是唯一的
print({10: 20, 'ab': 20, 10: 10}) # {10: 10, 'ab': 20}
-
-
字典的增删改查
-
查
-
查单个值:
- 字典[键] - 获取字典中指定键对应的值,键不存在报错(keyError)
- 字典.get(键) - 获取字典中指定键对应的值,键不存在返回None
- 字典.get(键, 默认值) - 获取字典中指定键对应的值,键不存在返回默认值
dog = {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} print(dog['name']) print(dog['age']) print(dog.get('name')) # print(dog['height']) # KeyError: 'height' print(dog.get('height')) # None print(dog.get('height', 30)) # 30
-
遍历
''' for 变量 in 字典: 循环体 ''' dog = {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} for key in dog: print(key, ':', dog.get(key), end=' ') # name : 小白 breed : 土狗 gender : 母狗 age : 2 else: print() # 练习:通过列表推导式获取字典所有的值 stu = {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'} values = [stu.get(key) for key in stu] print(values) # ['程明明', 27, 89, '18860901744', '男']
-
-
增、改
- 字典[键] = 值 - 当键不存在的时候添加键值对,存在时修改该键值对的值
- 字典.setdefault(key, value) - 键存在不做处理,不存在添加该键值对
dog = {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} print(dog) # {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} dog['weight'] = 10 print(dog) # {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10} dog['name'] = '小黑' print(dog) # {'name': '小黑', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10} dog.setdefault('name', '小青') print(dog) # {'name': '小黑', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10} dog.setdefault('height', 20) print(dog) # {'name': '小黑', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10, 'height': 20}
-
删
-
del 字典[键] - 删除字典中指定键对应的键值对
dog = {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} del dog['breed'] print(dog) # {'name': '小白', 'gender': '母狗', 'age': 2} # del dog['height'] # KeyError: 'height'
-
字典.pop(键) - 取出字典中指定键对应的值
dog = {'name': '小白', 'breed': '土狗', 'gender': '母狗', 'age': 2} print(dog.pop('name')) # 小白 print(dog) # {'breed': '土狗', 'gender': '母狗', 'age': 2}
-
-
-
字典推导式
-
{键: 值 for 变量 in 序列}
dict3 = {dict1[key]: key for key in dict1} print(dict3) # 练习: 使用推导式产生一个字典:{2: 4, 3: 6, 4: 8, 5: 10}, {2:22, 3:33, 4:44, 5:55} dict4 = {x: x*2 for x in range(2, 6)} dict5 = {x: x+10*x for x in range(2, 6)} print(dict4, dict5)
-
-
字典的应用
-
比较运算 - 字典不支持比较运算(比较大小)和数学运算
print([1, 2, 3, 4, 5] > [10, 20]) # False,比较第一对不相等的元素大小 print([-1] > []) # True # print({'a': 10} > {'a': 20}) # TypeError: '>' not supported between instances of 'dict' and 'dict'
-
in 和 not in - 键 in(not in) 字典 - 判断字典中是否(不)存在指定键对应的键值对
cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'} print('name' in cat) # True print('白色' in cat) # False
-
相关函数: len、dict
-
len - 统计字典中键值对的个数
print(len(cat)) # 3
-
dict - 将指定数据转换成字典。数据要求,a. 数据本身是一个序列 b. 序列中的元素必须是有且只有两个元素的小序列 c. 小序列中的元素必须是不可变的数据
seq = [(10, 20), '34'] print(dict(seq)) # {10: 20, '3': '4'} res = dict((x, x*2) for x in range(2, 6)) print(res) # {2: 4, 3: 6, 4: 8, 5: 10} # 字典转其它序列 cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'} print(list(cat)) # ['name', 'color', 'breed']
-
-
字典相关方法
-
字典.clear() - 清空字典
-
字典.copy() - 浅拷贝字典
-
字典.keys() - 获取字典中所有的键,返回值是序列
-
字典.values() - 获取字典中所有的值,返回值是序列
-
字典.items() - 将字典转换成元素是元组的序列
-
字典.setdefault(键, 值) - 添加键值对
-
字典.update(序列) - 批量添加,将序列中的元素添加到字典中(序列必须是可以转换为字典的序列)
-
字典.update(字典2) - 将字典2中的数据添加到字典中,如果键相同则更改键对应的值
print(cat.keys()) # dict_keys(['name', 'color', 'breed']) print(cat.values()) # dict_values(['咖啡', '白色', '折耳']) print(cat.items()) # dict_items([('name', '咖啡'), ('color', '白色'), ('breed', '折耳')]) cat.update([(10, 20), 'ab']) print(cat) # {'name': '咖啡', 'color': '白色', 'breed': '折耳', 10: 20, 'a': 'b'} cat_extend = {'weight': 3} cat.update(cat_extend) print(cat) # {'name': '咖啡', 'color': '白色', 'breed': '折耳', 10: 20, 'a': 'b', 'weight': 3}
-
-
2. 集合(set)
-
说明是集合(set)
- 集合是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开:{元素1, 元素2, 元素3,…}
- 集合是可变的(支持增删改),无序性(不支持下标)
- 集合的元素:必须是不可变的数据;唯一的
-
集合的注意事项
-
空集合
set1 = set() print(set1, type(set1), len(set1)) # set() <class 'set'> 0
-
集合无序
print({1, 2, 3} == {3, 2, 1}) # True
-
集合的元素是不可变的数据
print({10, 20, (10, 40)}) # {(10, 40), 10, 20} # print({10, 30, [10, 39]}) # TypeError: unhashable type: 'list'
-
集合元素是唯一的
print({10, 30, 40, 0, 10, 40, 20}) # {0, 40, 10, 20, 30} names = ['张三', '李四', '小明', '小李', '张三', '小明', '张三'] print(list(set(names))) # ['张三', '小李', '李四', '小明']
-
-
集合的增删改查
-
查 - 遍历
nums = {10, 78, 67, 34, 23, 45, 21, 54} for x in nums: print(x, end=' ') # 34 67 10 45 78 21 54 23 else: print()
-
增
# a. 集合.add(元素) - 在集合中添加指定元素 # b. 集合.update(序列) - 将序列中所有的元素都添加到集合中 nums = {10, 78, 67, 34, 23, 45, 21, 54} nums.add(100) print(nums) # {34, 67, 100, 10, 45, 78, 21, 54, 23} nums.update('abc') print(nums) # {'c', 34, 67, 100, 'a', 10, 45, 78, 'b', 21, 54, 23} nums.update({'name': '张三', 'sex': '男'}) print(nums) # {'b', 34, 67, 100, 'sex', 'c', 10, 45, 78, 21, 54, 23, 'name', 'a'}
-
删
# a. 集合.remove(元素) - 删除指定元素 # b. 集合.discard(元素) - 删除指定元素 nums = {10, 78, 67, 34, 23, 45, 21, 54} nums.remove(10) print(nums) # {34, 67, 45, 78, 21, 54, 23} nums.discard(34) print(nums) # {67, 45, 78, 21, 54, 23} # nums.remove(10) # print(nums) # KeyError: 10 nums.discard(10) print(nums) # {67, 45, 78, 21, 54, 23}
-
-
集合数学运算: &(交集), |(并集), -(差集), ^(对称差集),><(判断是否是真子集),>=/<=(判断是否是子集)
set1 = {1, 2, 3, 4, 5, 6} set2 = {4, 5, 6, 7, 8} # 1. 集合1 & 集合2 - 交集(获取两个集合的交集) print(set1 & set2) # {4, 5, 6} # 2. 集合1 | 集合2 - 并集(获取两个集合的并集) print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8} # 3. 集合1 - 集合2 - 差集(获取集合1中除了交集以外的元素) print(set1 - set2) # {1, 2, 3} # 4. 集合1 ^ 集合2 - 对称差集(集合1与集合2的合集去掉集合1与集合2的交集) print(set1 ^ set2) # {1, 2, 3, 7, 8} # 5. 集合1 > 集合2 - 判断集合2是否是集合1的真子集 print({10, 20, 30, 40} > {1, 2}) # False,判断集合2是否是集合1的真子集 print({10, 20, 30, 40} > {10, 20}) # True, 判断集合2是否是集合1的真子集 # 6. 集合1 >= 集合2 - 判断集合2是否是集合1的子集 print(set1 >= set2) # False
3. 数字
-
python中数字相关的类型有4种:int、float、bool、complex
-
complex(复数)
# e**i(pi) = cos(pi) + jsin(pi) # python中复数的格式: a + bj (j是虚数单位,j**2 == -1,b是1的时候不能省) a = 10 + 2j c = 0 + 1j print(a, type(a)) # (10+2j) <class 'complex'> # python的复数直接支持复数运算 from math import cos from math import sin b = 10 + 5j print(a * b) # (90+70j) print(a + b) # (20+7j) print(a / b) # (0.88-0.24j) d = cos(10) + sin(10)*c print(d) # (-0.8390715290764524-0.5440211108893698j) print(math.e**(2*math.pi*c)) # (1-2.4492935982947064e-16j)
-
数学模块
num = -3.99 # 将浮点数转化为整数 # 1)int(浮点数) - 直接去掉小数点和小数点后面的数 print(int(num)) # -3 # 2) math.ceil(浮点数) print(math.ceil(1.99)) # 2 print(math.ceil(1.29)) # 2 print(math.ceil(2.0000001)) # 3 print(math.ceil(-3.0001)) # -3 # 3) math.fabs(数字) - 获取数字的绝对值,结果一定是浮点数 # abs(数字) - 获取数字的绝对值 print(math.fabs(-4.5)) # 4.5 print(abs(-34.4)) # 34.4 print(abs(34)) # 34 # 4) math.floor(浮点数) - 向小取整 print(math.floor(1.99)) # 1 print(math.floor(1.001)) # 1 print(math.floor(-1.99)) # -2 # 5) round(浮点数) print(round(2.49999)) # 2 print(round(2.5)) # 2 print(round(2.61111)) # 3 print(round(-2.5)) # -2 print(round(-2.51)) # -3
-
作业
1.用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
# 选语文课
ch_stu = {'小明', '青枫', '苍梧', '小青', '梦雪', '小何', '小王', '小晴'}
# 选数学课
math_stu = {'小明', '小李', '青枫', '苍梧', '梦雪', '小玖'}
# 选英语课
eng_stu = {'小明', '青枫', '苍梧', '小青', '小何', '赵宇', '小王', '小玖'}
-
求选课学生总共有多少人
all_stu = ch_stu | math_stu | eng_stu print('总人数:', len(all_stu)) # 方法二 dict1 = {} for name in ch_stu: if name not in dict1: dict1.setdefault(name, 1) else: dict1[name] += 1 for name in math_stu: if name not in dict1: dict1.setdefault(name, 1) else: dict1[name] += 1 for name in eng_stu: if name not in dict1: dict1.setdefault(name, 1) else: dict1[name] += 1 all_stu = set(dict1) print('总人数', len(dict1))
-
求只选了第一个学科的人的数量和对应的名字
set1 = ch_stu - (ch_stu & eng_stu) - (ch_stu & math_stu) print('人数:', len(set1), '姓名:', *set1)
-
求只选了一门学科的学生的数量和对应的名字
one_names = {name for name in dict1 if dict1[name] == 1} print('只选一门学科的学生姓名:', *one_names, ',数量:', len(one_names)) three_names = {name for name in dict1 if dict1[name] == 3} three_names = ch_stu & math_stu & eng_stu one_names = ch_stu ^ eng_stu ^ math_stu - three_names # 方法二 # one_names = all_stu - (ch_stu & eng_stu) - (ch_stu & manth_stu) - (manth_stu & eng_stu) # 方法三 print('只选一门学科的学生姓名:', *one_names, ',数量:', len(one_names))
-
求只选了两门学科的学生的数量和对应的名字
two_names = {name for name in dict1 if dict1[name] == 2} two_names = all_stu - one_names - three_names print('只选二门学科的学生姓名:', *two_names, ',数量:', len(two_names))
-
求选了三门学生的学生的数量和对应的名字
print('只选三门学科的学生姓名:', *three_names, ',数量:', len(three_names))
from os import system
stus = []
count = 0
while True:
print('=============================================')
print('欢迎xxxxxx:')
print('\t\t\t', '1. 添加学生')
print('\t\t\t', '2. 查看学生信息')
print('\t\t\t', '3. 修改学生信息')
print('\t\t\t', '4. 删除学生')
print('\t\t\t', '5. 返回')
print('=============================================')
choose = input('请选择(1~5):')
while choose != '5':
if choose == '1':
while True:
name = input('请输入学生姓名:')
age = input('请输入学生的年龄:')
tel = input('请输入学生的电话:')
count += 1
stu_id = 'stu00'+str(count) if count < 10 else 'stu0'+str(count) if count < 100 else 'stu'+str(count)
stus.append({'id': stu_id, 'name': name, 'age': age, 'tel': tel})
print('添加成功!')
print('1. 继续')
print('2. 返回')
chs = input('请选择(1~2):')
while chs != '2':
if chs == '1':
break
else:
print('输入有误!')
chs = input('请选择(1~2):')
else:
break
break
elif choose == '2':
while True:
print('1. 查看所有学生')
print('2. 按姓名查找')
print('3. 按学号查找')
print('4. 返回')
chs = input('请选择(1-4):')
while chs != '4':
if chs == '1':
for stu in stus:
print('学号:', stu.get('id'), '姓名:', stu.get('name'), '年龄:', stu.get('age'), '电话:', stu.get('tel'))
break
elif chs == '2':
name = input('请输入学生姓名:')
for stu in stus:
if stu['name'] == name:
print('学号:', stu.get('id'), '姓名:', stu.get('name'), '年龄:', stu.get('age'), '电话:', stu.get('tel'))
break
elif chs == '3':
stu_id = input('请输入学生学号:')
for stu in stus:
if stu['id'] == stu_id:
print('学号:', stu.get('id'), '姓名:', stu.get('name'), '年龄:', stu.get('age'), '电话:', stu.get('tel'))
break
break
else:
print('输入有误!')
chs = input('请选择(1-4):')
else:
break
break
elif choose == '3':
while True:
print('1. 修改学生信息')
print('2. 返回')
chs = input('请选择(1-2):')
while chs != '2':
out = False
stu_id = input('请输入要修改学生的学号:')
new_stu = None
for stu in stus:
if stu['id'] == stu_id:
new_stu = stu
print('学号:', stu.get('id'), '姓名:', stu.get('name'), '年龄:', stu.get('age'), '电话:', stu.get('tel'))
break
if not new_stu:
print('没有该学生信息!')
break
chs = input('请选择需要修改的信息(1.姓名 2.年龄 3.电话 4.返回):')
while chs != '4':
if chs == '1':
new_stu['name'] = input('请输入更改后的姓名:')
out = True
break
elif chs == '2':
new_stu['age'] = input('请输入更改后的年龄:')
out = True
break
elif chs == '3':
new_stu['tel'] = input('请输入更改后的电话:')
out = True
break
else:
print('输入有误!')
chs = input('请选择需要修改的内容(1-4):1.姓名 2.年龄 3.电话 4.返回')
else:
break
if out:
print('修改成功!')
break
else:
break
break
elif choose == '4':
while True:
print('1. 删除学生信息')
print('2. 返回')
chs = input('请选择(1-2):')
while chs != '2':
if chs == '1':
stu_id = input('请输入要删除学生的学号:')
for stu in stus:
if stu['id'] == stu_id:
stus.remove(stu)
print('删除成功!')
break
else:
print('没有该学生信息!')
break
break
else:
print('输入有误!')
chs = input('请选择(1-2):')
else:
break
break
else:
print('输入有误!')
choose = input('请选择(1~5):')
system('cls')
else:
break