01字典
-
1.什么是字典
字典是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开,每个元素必须是键值对:{键1:值1,键2:值2,键3:值3,…}
字典是可变的(支持增删改);字典无序
键:不可变的数据才可以做为字典的键 (数字、字符串、元组);键是唯一的
值:值才是字典真正想要保存的数据,键的作用就像列表中的下标用来对值进行区分和说明。值可以是任何类型的数据。-
1)空字典
dict1 ={} print(dict1,type(dict1),len(dict1)) # {} <class 'dict'> 0
-
2)字典无序
print([1,2,3] == [3,2,1]) # False print({'a':10,'b':20} == {'b':20,'a':10}) # True
-
- 键是不可变的
print({10:20,'abc':100,(1,2):300}) # print({10:20,'abc':100,[1,2]:300}) # TypeError: unhashable type: 'list'
-
- 键的唯一的
print({10:20,'abc':30,10:20,'abc':300}) # {10: 20, 'abc': 300} 只保存最后的值一个
-
02字典的增删查改
1.查 - 获取值
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
-
1) 查单个:
-
a.字典[键] - 获取字典中指定键对应的值,键不存在会报错
-
b.字典.get(键) - 获取字典中指定键对应的值,键不存在不会报错返回None
-
c.字典.get(键,默认值) - 获取字典中指定键对应的值, 键不存在不会报错,返回默认值
print(dog['name']) print(dog['age']) print(dog.get('breed')) # print(dog['height']) # KeyError: 'height' print(dog.get('height')) # None print(dog.get('height', 100)) # 40 print(dog.get('breed', 20)) # 土狗
-
-
2)遍历
-
for 变量 in 字典:
循环体 -
注意:变量取到的是字典的键
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2} for x in dog: print(x, dog[x]) # 键 值
# 练习 students = [ {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'}, {'name': '梅迁', 'age': 26, 'score': 93, 'tel': '13567193428', 'gender': '男'}, {'name': '张三', 'age': 18, 'score': 43, 'tel': '15367423810', 'gender': '女'}, {'name': '李四', 'age': 34, 'score': 65, 'tel': '13799413758', 'gender': '不明'}, {'name': '王麻子', 'age': 23, 'score': 76, 'tel': '15533753219', 'gender': '男'}, {'name': '李冰冰', 'age': 17, 'score': 99, 'tel': '17742589773', 'gender': '女'} ] # 练习:统计未成年的人数 count = 0 for stu in students: if stu['age'] < 18: count += 1 print('未成年人数',count) # 练习:通过列表推导式获取字典所有的值 stu = {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'} # ['程明明', 27, 89, '18860901744', '男'] list1 = [stu[x] for x in stu] print(list1)#
-
2.增、改
-
字典[键] = 值 - 当键不存在的时候添加键值对,当键存在的时候修改指定键对应的值
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2} print(dog) # 添加 dog['weight'] = 10 print(dog) # 修改 dog['name'] = '旺财' print(dog)
3.删除
-
- del 字典[键] - 删除字典中指定键 对应的键值对
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2} del dog['breed'] print(dog) # {'name': '财财', 'gender': '母狗', 'age': 2} # del dog['height'] # KeyError: 'height'
-
2)字典.pop(键) - 取出字典中指定键对应的值 是值
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2} del_val = dog.pop('gender') print(dog, del_val) # {'name': '财财', 'breed': '土狗', 'age': 2} 母狗
# 练习:写程序交换字典的键和值
# {'a': 'b', 'c': 'd', 'e': 'f'} -> {'b': 'a', 'd': 'c', 'f': 'e'}
dict1 = {'a': 'b', 'c': 'd', 'e': 'f'}
# 方法一:空字典
dict2 = {}
for x in dict1:
dict2[dict1[x]] = x
print(dict2)
# 方法二:
# 字典推导式{键:值 for 变量 in 序列}
dict3 = {dict1[x]: x for x in dict1}
print(dict3)
# 练习:使用推导式产生一个字典:
# {2:4, 3:6, 4:8, 5:10}
# {2:22, 3:33, 4:44, 5:55}
dict4 = {i: 2*i for i in range(2, 6)}
print(dict4)
dict5 = {i: 11*i for i in range(2, 6)}
print(dict5)
03字典相关操作和方法
-
1.运算符
字典不支持比较运算(比较大小) 和数学运算
print([1, 2, 3, 4, 5] > [10, 20]) # False 比较第一对不相等的元素的大小 1<10 # print({'a':10} > {'a':20}) # TypeError: '>' not supported between instances of 'dict' and 'dict' # print({'a':10} + {'b':20}) #TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
-
2 in / not in
-
键 in 字典 - 判断字典中是否存在指定键对应的键值
-
键 not in 字典
cat = {'name':'咖啡','color':'白色','breed':'折耳'} print('咖啡' in cat) # False 不是键 print('name' in cat) # True 键
-
-
3.相关函数:len dict
print(len(cat)) # 3 # dict(数据) - 将指定数据转换成字典 # 数据的要求: # a. 数据本身就是一个序列 # b.序列中的元素必须是有且只有两个元素的小序列 # c.小序列中的元素必须是不可变的元素 seq =[(10,20),'ab'] # 元组,字符串 不可变 两个小序列 result = dict(seq) print(result) # {10: 20, 'a': 'b'} result = dict((x,x*2) for x in range(3)) print(result) # {0: 0, 1: 2, 2: 4} # 字典转列表 cat = {'name':'咖啡','color':'白色','breed':'折耳'} print(list(cat)) # ['name', 'color', 'breed'] 只有键
-
4.字典相关方法
-
1)字典.clear()
cat.clear() print(cat)
-
2)字典.copy()
cat = {'name':'咖啡','color':'白色','breed':'折耳'} cat2 = cat.copy() print(cat2,id(cat),id(cat2)) # {'name': '咖啡', 'color': '白色', 'breed': '折耳'} 2425858697960 2425858711208
-
3)keys value items
# 字典.keys() - 获取字典所有的键,返回序列 print(cat.keys()) # dict_keys(['name', 'color', 'breed']) # 字典.values() - 获取字典所有的值,返回序列 print(cat.values()) # dict_values(['咖啡', '白色', '折耳']) # 字典.items() - 将字典转换成元素是元组的序列(一个键对 对应一个元组) print(cat.items()) # dict_items([('name', '咖啡'), ('color', '白色'), ('breed', '折耳')]) for x, y in cat.items(): print(x, y) # name 咖啡 # color 白色 # breed 折耳
-
4)setdefault(键,值) - 添加键值对
cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'} cat.setdefault('weight', 10) print(cat) # {'name': '咖啡', 'color': '白色', 'breed': '折耳', 'weight': 10} cat.setdefault('color','黑色') print(cat) # {'name': '咖啡', 'color': '白色', 'breed': '折耳', 'weight': 10} # 键存在的时候不会修改
-
- 字典.update(序列) - 将序列中的元素添加到字典中(序列必须是可以转换成字典的序列)
字典1.update(字典2) - 将字典2中所有的键值对添加到字典1中
cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'} cat.update([(10,20),'ab']) print(cat) # {'name': '咖啡', 'color': '白色', 'breed': '折耳', 10: 20, 'a': 'b'} cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'} cat.update({'a': 10,'b': 20,'color': '黑色'}) print(cat) # {'name': '咖啡', 'color': '黑色', 'breed': '折耳', 'a': 10, 'b': 20} # 颜色会改变
-
04实际开发中的字典
cl = {
'name': 'python2103',
'address': '6教室',
'students': [
{
'name': 'stu1',
'age': 20,
'tel': '11102',
'gender': '男',
'linkman': {'name': '张三', 'tel': '9202'}
},
{
'name': 'stu2',
'age': 24,
'tel': '111087',
'gender': '女',
'linkman': {'name': '李四', 'tel': '8923'}
},
{
'name': 'stu3',
'age': 22,
'tel': '321087',
'gender': '女',
'linkman': {'name': '王五', 'tel': '8290123'}
}
],
'teachers': [
{'name': '余婷', 'job': '讲师', 'QQ': '72282612'},
{'name': '舒玲', 'job': '班主任', 'QQ': '8272129'}
]
}
# 练习:
# 打印所有学生的紧急联系人的电话
for x in cl['students']:
print('紧急联系人电话', x['linkman']['tel'])
# 打印所有老师的名字
for x in cl['teachers']:
print('所有老师的名字', x['name'])
# 给所有的紧急联系人添加性别,性别默认是男
for x in cl['students']:
x['linkman'].setdefault('性别', '男')
print(cl['students'])
05 数字数据
python 中数字相关的类型有4种: int float bool complex
True == 1 False == 0
-
1.complex - 复数
python 中复数的格式 a + bj (j是虚数单位, j**2 == -1 b是1的时候不能省)
a = 10 + 2j print(a, type(a)) # (10+2j) <class 'complex'> # python 的复数直接支持复数运算 b = 5-6j print(a + b) # (15-4j) print(a * b) # (62-50j) # print(a / b)
-
2.数学模块
import math
import cmath # 复数-
1)浮点数转换成整数
# 1) int(浮点数) - 直接去掉小数点后面的数 print(int(num)) # 1) ceil函数 print(math.ceil(1.99)) # 2 print(math.ceil(1.29)) # 2 print(math.ceil(2.001)) # 3 print(math.ceil(-3.001)) # -3 print(math.copysign(-4,-2)) # -4.0 前面提供绝对值,后面提供符号
-
2) 绝对值
# 绝对值 math.fabs() print(math.fabs(-32)) # 32.0 浮点型 print(math.fabs(12)) # 12.0 浮点型 # 绝对值 abs print(abs(-32)) # 32 print(abs(-32.2)) # 32.2
-
3)阶乘
print(math.factorial(3)) # 阶乘
-
4)math.floor(浮点数) - 向小取整
print(math.floor(1.001)) # 1 print(math.floor(1.99)) # 1 print(math.floor(-2.999)) # -3
-
5)round(浮点数) - 四舍五入
print(round(2.999)) # 3 print(round(2.4599)) # 2 print(round(-3.001)) # -3 print(round(-3.689)) # -4
-
06 集合
-
1.什么是集合
集合是容器型数据类型(序列),将{}作为容器标志,里面有多个元素用逗号隔开:{元素1,元素2…}
集合是可变的(支持增删改);无序的(不支持下标操作)
集合的元素:必须是不可变的数据;唯一的-
1)空集合
set1 = {} # 表示空字典 set2 = set() print(set2, type(set2), len(set2)) # set() <class 'set'> 0
-
- 集合无序
print({1, 2, 3} == {3, 2, 1}) # True
-
- 集合的元素是不可变的数据
print({10, 'abc', (2,3)}) # print({10, 'abc', [2,3]}) # 报错
-
4) 集合元素是唯一的
print({10, 20, 30, 10, 10, 20}) # {10, 20, 30} names=['张三', '李四', '张三', '李四', '李四', '张三'] print(set(names)) # {'李四', '张三'} print(list(set(names))) # ['张三', '李四']
-
-
2.集合的增删改查
-
1) 查 - 只有遍历
nums = {10,78,67,35,70,89} for x in nums: print(x) # 顺序可能不一样 先转换成列表 ,再遍历列表
-
2)增
# 集合.add(元素) - 在集合中添加指定元素 nums.add(100) print(nums) # 集合.update(序列) - 将序列中所有的元素添加到集合中 nums.update('abc') # 序列 -> 'a' 'b' 'c' print(nums) nums.update({'name':'张三','age':18}) print(nums) # {35, 67, 100, 70, 'name', 'b', 'age', 10, 78, 'a', 89, 'c'} # 添加键
-
3)删
# 集合.remove(元素) - 删除指定元素,元素不存在就报错 # 集合.discard(元素) - 删除指定元素,元素不存在不会报错 nums = {10, 78, 67, 35, 70, 89} nums.remove(10) print(nums) # {35, 67, 70, 78, 89} nums.discard(35) print(nums) # {67, 70, 78, 89} # nums.remove(1000) # KeyError: 1000 nums.discard(1000) print(nums) # {67, 70, 78, 89} 不会报错
-
07数学集合运算
&(交集) 、|(并集)、 -(差集)、^(对称差集)、><(判断是否是真子集)、>=<=(判断是否是子集)
-
1.集合1 & 集合2 - 交集
set2 = {1, 2, 3} & {1, 2, 4, 5} print(set2) # {1, 2}
-
2.集合1 | 集合2 - 并集
set1 = {1, 2, 3} | {4, 5} print(set1) # {1, 2, 3, 4, 5}
-
3.集合1 - 集合2 - 差集 (获取集合1中除了包含在集合2中的元素)
set3 = {1, 2, 3, 4, 5} - {4, 5, 6, 7} print(set3) # {1, 2, 3} set3 = {4, 5, 6, 7} - {1, 2, 3, 4, 5} print(set3) # {6, 7}
-
4.集合1 ^ 集合2 - 对称差集 (集合1,2合并去掉公共部分)
set4 = {1, 2, 3, 4, 5} ^ {4, 5, 6, 7} print(set4) # {1, 2, 3, 6, 7}
-
5.集合1 > 集合2 - 判断集合2是否是集合1的真子集
-
集合1 >= 集合2 - 判断集合2是否是集合1的子集
set5 = {1, 2, 3, 4, 5} > {4, 5, 6, 7} print(set5) # False set5 = {4, 5} < {4, 5, 6, 7} print(set5) # True 真子集 set5 = {1, 2, 3, 4, 5} > {1,2} print(set5) # True print({10, 20} > {10, 20}) # False print({10, 20} >= {10, 20}) # True
作业
-
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
- 统计不及格学生的个数
- 打印不及格学生的名字和对应的成绩
- 统计未成年学生的个数
- 打印手机尾号是8的学生的名字
- 打印最高分和对应的学生的名字
- 删除性别不明的所有学生
- 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
students=[ {'name':'小明','age':30,'score':89,'tel':'566245','性别':'女'}, {'name':'小红','age':25,'score':90,'tel':'566245','性别':'男'}, {'name':'小张','age':20,'score':50,'tel':'566245','性别':'女'}, {'name':'小赵','age':17,'score':63,'tel':'566245','性别':'未知'}, {'name':'小李','age':18,'score':70,'tel':'566245','性别':'男'}, {'name':'小吴','age':19,'score':90,'tel':'566245','性别':'女'}, ] #a.统计不及格学生的个数 count =0 for x in students: if x['score'] < 60: count +=1 print(count) # 1 # b.打印不及格学生的名字和对应的成绩 for x in students: if x['score'] < 60: print(x['name'],x['score']) # 小张 50 # c.统计未成年学生的个数 count1=0 for x in students: if x['age'] < 18: count1 += 1 print(count1) #1 # d.打印手机尾号是8的学生的名字 for x in students: if int(x['tel']) % 10 == 8: print('手机尾号是8的学生的名字',x['name']) # 手机尾号是8的学生的名字 小张 # 手机尾号是8的学生的名字 小赵 # 手机尾号是8的学生的名字 小吴 # e.打印最高分和对应的学生的名字 max1 =0 for x in students: if x['score'] >= max1: max1 = x['score'] for x in students: if x['score'] == max1: print('最高分和对应的学生的名字',x['name'] ) # 最高分和对应的学生的名字 小红 # 最高分和对应的学生的名字 小吴 # f.删除性别不明的所有学生 new_students = [] for x in students: if x['性别'] != '未知': new_students.append(x) print(new_students) # [{'name': '小明', 'age': 30, 'score': 89, 'tel': '566245', '性别': '女'}, {'name': '小红', 'age': 25, 'score': 90, 'tel': '566245', '性别': '男'}, {'name': '小张', 'age': 20, 'score': 50, 'tel': '566278', '性别': '女'}, {'name': '小李', 'age': 18, 'score': 70, 'tel': '566245', '性别': '男'}, {'name': '小吴', 'age': 19, 'score': 90, 'tel': '566288', '性别': '女'}] # g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃) new_students2 = [] for x in students: new_students2.append(x['score']) #print(new_students2) new_students2.sort(reverse=True) print(new_students2) # [90, 90, 80, 70, 63, 50]
-
用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
- 求选课学生总共有多少人
- 求只选了第一个学科的人的数量和对应的名字
- 求只选了一门学科的学生的数量和对应的名字
- 求只选了两门学科的学生的数量和对应的名字
- 求选了三门学生的学生的数量和对应的名字
class1 ={'张一', '李二', '王四', '李一', '张四', '赵六'}
class2 ={'张二', '李二', '王四', '李一', '张四', '赵一'}
class3 ={'张三', '李二', '王三', '李一', '张四', '赵六'}
# 1. 求选课学生总共有多少人
set1 = class1 | class2 | class3
print(set1)
# {'王三', '李二', '李一', '赵六', '张四', '王四', '张一', '赵一', '张三', '张二'}
# 2. 求只选了第一个学科的人的数量和对应的名字
print(len(class1), class1)
# 6 {'李二', '李一', '赵六', '张四', '王四', '张一'}
# 3. 求只选了一门学科的学生的数量和对应的名字
set1 = class1 | class2 | class3
set2 = set1 - (class1 & class2)-(class2 & class3)-(class1 & class3)
print(set2)
#{'王三', '张三', '张一', '赵一', '张二'}
# 4. 求只选了两门学科的学生的数量和对应的名字
set1 = class1 | class2 | class3
set3 = set1 - (class1 & class2 & class3)
print(len(set3),set3)
# 7 {'王三', '赵六', '王四', '张一', '赵一', '张三', '张二'}
# 5. 求选了三门学生的学生的数量和对应的名字
set4 = class1 & class2 & class3
print(len(set4),set4)
#3 {'张四', '李二', '李一'}
学生信息管理系统
dict1 ={}
flag0 = 1
names_list = []
age_list = []
tel_list = []
new_list = []
index = 0
while flag0:
print('=======================')
print('欢迎光临!')
print(' 1.添加学生')
print(' 2.查看学生')
print(' 3.修改学生信息')
print(' 4.删除学生')
print(' 5.返回')
print('=======================')
flag = int(input('请输入(1-5):'))
while True:
if flag == 1:
names_list.append(input('请输入学生姓名:'))
age_list.append(input('请输入学生年龄:'))
tel_list.append(input('请输入学生电话:'))
# dict1.setdefault('age', input('请输入学生:'))
# dict1.setdefault('tel', input('请输入学生电话:'))
if names_list:
print('添加成功!')
# print(dict1)
print('1.继续')
print('2.返回')
flag1 = int(input('请输入(1-2):'))
if flag1 == 1:
continue
else:
break
elif flag == 2:
print('1.查看所有学生')
print('2.按姓名查找')
print('3.按学号查找')
print('4.返回')
flag2 = int(input('请输入(1-4):'))
for i in range(len(names_list)):
dict1['name'] = names_list[i]
dict1['age'] = age_list[i]
dict1['tel'] = tel_list[i]
new_list.append(dict1.copy())
if flag2 == 1:
print(new_list)
elif flag2 == 2:
new_name = input('请输入所要查找的姓名:')
for x in new_list:
if new_name == x['name']:
print(x)
break
elif flag2 == 3:
continue
elif flag2 == 4:
break
elif flag == 3:
break
elif flag == 4:
break
else:
flag0 = 0
break