day7_字典和集合

回顾

1 .相关函数

max、min、sum、sorted、reversed、len、list

2 .相关方法

3 .推导式

变换 ->[表达式 for 变量 in 序列]

部分变换 -> [三目运算符 for 变量 in 序列]

筛选、删除 -> [表达式 for 变量 in 序列 if 条件语句]

4 .元组

(元素1,元素2,元素3,…)

不可变的,有序的

任何类型的数据都可以作为元组元素

t1 = (23,)
t2 = 10,20,30,'ss'
t3 = (100,200,300)
x,y,z = t3
a,b,*c = 1,2,3,45,6,7

元组就是不可变的列表。

查,切片,in /not in,加减乘

字典

1.什么是字典(dict)

字典是容器型数据类型(序列),具备同时保存多个数据的能力

将{}作为容器标志,里面多个元素用逗号隔开(每个元素必须是键值对)

{键1:值1,键2:值2,键3:值3}

字典是可变的,支持增删改

字典无序

键:不可变的数据才能作为字典的键(数字、字符串、元组);键是唯一的

值:值才是字典真正想要保存的数据,键的作用就像列表中的下标来对值进行区分和说明的。值可以是任何类型的数据

1) 空字典

dict1 = {}
print(dict1,type(dict1),len(dict1))

2)字典无序

print([1,2,3] == [3,2,1])  #False

print({'a':10,'b':20} == {'b':20,'a':10})  #True

3)键是不可变的

print({10:20,'123':100,(1,2):300})

print({10:20,'123':100,[1,2]:300})   #报错

4)键是唯一的

print({10:20,'abc':30,10:40,'abc':50})   #{10:40,'abc':50}

2. 增删改查

1)查 - 获取值

a) 查单个

Ⅰ.字典[键] - 获取字典中指定键值对应的值,键不存在会报错

Ⅱ.字典.get(键) - 获取字典中指定键对应的值,键不存在不会报错,返回None

Ⅲ.字典.get(键,默认值) - 获取字典中指定键对应的值,键不存在不会报错,返回默认值

dog = {'name':'财财','breed':'中华田园犬','gender':'母狗','age':2}

字典[键] - 获取字典中指定键对应的值

print(dog['name'])
print(dog['age'])
print(dog.get('breed'))
print(dog.get('height',0))
b)遍历
for 变量 in 字典:
    循环体

注意:变量渠道的是字典的键

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': '女'}
]
# 练习:统计未成年的人数
under_age = 0
for x in students:
    if x.get('age') < 18:
        under_age += 1
print(under_age)

练习:通过列表推导式获取字典所有的值

stu = {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'}
values = [stu[x] for x in stu]
print(values)
c) 增、改

字典[键] = 值 - 当键不存在的时候添加键值对,

dog['weight'] = 10  #添加
dog['name'] = '李不乖'
d)删
Ⅰ. del 字典[键] - 删除字典中指定键对应的键值对
del dog['breed']

如果不存在会报错 KeyError

Ⅱ.字典.pop(键) - 取出字典中指定键对应的值
dog.pop('gender')

练习:写程序交换字典的键和值

{‘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 序列}
dict2 = {dict1[x]:x for x in dict1}
print(dict2)

练习:使用推导式产生一个字典:
{2:4, 3:6, 4:8, 5:10}
{2:22, 3:33, 4:44, 5:55}

dict3 = {x:2*x for x in range(2,6)}
print(dict3)
dict4 = {x:11*x for x in range(2,6)}
print(dict4)

3.字典的相关操作和方法

1).运算符

字典不支持比较运算(比较大小)和数学运算

print([1, 2, 3, 4, 5] > [10, 20])
#False ,比较第一对不相等的元素大小
print({'a':'10'}>{'a':20})

TypeError: ‘>’ not supported between instances of ‘dict’ and ‘dict’

2).in 和 not in

键 in 字典 - 判断字典中是否存在指定键对应的键值对

键 not in 字典

cat = {'name':'咖啡','color':'white','breed':'暹罗'}
print('name' in cat)    #True
print('咖啡' in cat)     #False

3).相关函数

len、dict

print(len(cat))   #3

dict(数据) - 将指定数据转换成字典

​ 数据的要求:a.数据本身是一个序列

​ b.序列中的元素必须是有且只有两个元素的小序列

​ c.小序列中的元素必须是不可变的数据

seq = [(10,20),'ab']
result = dict(seq)
print(result)
result = dict((x,x*2)for x in range(3))
print(result)

字典转其他序列

print(list(cat))
#['name', 'color', 'breed']
#直接把字典里的键拿出来

4)字典相关方法

a)字典.clear()
cat.clear()
b)字典.copy()
cat2 = cat.copy()   #还是浅拷贝
print(cat2,id(cat),id(cat2))
c)keys、values、items

字典.keys() - 获取字典所有的键,返回值是序列

字典.values() - 获取字典所有的值,返回值是序列

字典.items() - 将字典转换成元素是元组的序列(一个键值对对应一个元组)

print(cat.keys())  # dict_keys(['name', 'color', 'breed'])
print(cat.values())# dict_values(['咖啡', 'white', '暹罗'])
print(cat.items())#dict_items([('name', '咖啡'), ('color', 'white'), ('breed', '暹罗')])
for x,y in cat.items():
    print(x,y)
d)字典.setdefault(键,值) - 添加键值对

添加时候可以保证没有才添加,如果有,就不会改变

cat.setdefault('weight',11)
cat.setdefault('color','黑色')
print(cat)
#{'name': '咖啡', 'color': 'white', 'breed': '暹罗', 'weight': 11}
e)字典.update(序列) - 将序列中的元素添加到字典中(序列必须是可以转换成字典的序列)

字典1.update(字典2) - 将字典2中所有的键值对添加到字典1中

cat.update([(10,200),'ab'])
print(cat)
cat.update({'a':10,'b':20})#没有的加进去,有的修改
print(cat)
cat.update({'breed':'银渐层'})
print(cat)
'''{'name': '咖啡', 'color': 'white', 'breed': '暹罗', 'weight': 11, 10: 200, 'a': 10, 'b': 20}
{'name': '咖啡', 'color': 'white', 'breed': '银渐层', 'weight': 11, 10: 200, 'a': 10, 'b': 20}
'''

练习:打印所有学生的紧急联系人的电话

练习:打印所有老师的名字

练习:给所有紧急联系人添加性别,默认是男

cl = {
    'name': 'py2103',
    'address': '6教',
    'students': [
        {'name': 'stu1',
         'age': 20,
         'tel': '1111',
         'gender': 'M',
         'linkman': {'name': '张三', 'tel': '1222'}
         },
        {'name': 'stu2',
         'age': 22,
         'tel': '1211',
         'gender': 'F',
         'linkman': {'name': '张四', 'tel': '1223'}
         },
        {'name': 'stu3',
         'age': 23,
         'tel': '1231',
         'gender': 'F',
         'linkman': {'name': '张五', 'tel': '1225'}
         }
    ],
    'teachers': [
        {'name': '鱼鱼',
         'job': '讲师',
         'QQ': '11234546'
         },
        {'name': '花花',
         'job': '讲师',
         'QQ': '11236546'
         }

    ]

}
for stu in cl['students']:
    print(stu.get('linkman').get('tel'))
    stu.get('linkman').setdefault('gender','男')
for tec in cl['teachers']:
    print(tec.get('name'))
for stu in cl['students']:
    print(stu.get('linkman'))

================================================
# 紧急联系人电话
for stu in cl['students']:
    print('紧急联系人的电话',stu['linkman']['tel'])
# 老师姓名
for tea in cl['teachers']:
    print(tea['name'])
# 性别
for x in cl['students']:
    x['linkman']['gender'] = '男'
print(cl['students'])

集合

1. 什么是集合(set)

集合是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开:{元素1,元素2,元素3…}

集合是可变的(支持增删改),无序的(不支持下标操作)

集合的元素:必须是不可变的数据;唯一的

1) 空集合

set1 = set()
print(set1,type(set1),len(set1))

2)集合无序

print({1,2,3}=={3,2,1}) #True

3) 集合的元素是不可变的数据

print({10,'abc',(2,3)})
print({10,'abc',[2,3]})   #报错

4)集合元素是唯一的

print({10,20,30,10,10,20})  #{10,20,30}

names = ['小张','小李','小李','小张','小张']
print(list(set(names)))

2.集合的增删改查

1)查 - 只有遍历

nums = {10,30,65,70,89,45}
for x in nums:
    print(x)

2)增

集合.add(元素) - 在集合中添加指定元素

集合.update(序列) - 将序列中所有元素都添加到集合中

nums.add(200)
print(nums)
nums.update('abc')
print(nums)
nums.update({'name':'lili','age':20})
print(nums)
#把键作为元素加到集合里去

3)删

集合.remove(元素) - 删除指定元素

集合.discard(元素) - 删除指定元素

区别:如果删除的元素不存在,remove会报错,discard不会报错

nums.remove(1000)
nums,discard(1000)

4) 集合运算

交集&
并集|
差集-
对称差集^
判断是否是真子集><
判断是否是子集>=<=

set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8}
# 1.set1 & set2 交集
print(set1 & set2)
# 2.set1 | set2 并集
print(set1 | set2)
# 3. set1 - set2 差集,获取集合1中除了包含在集合2中以外的元素
print(set1 - set2)
print(set2 - set1)
# 4. set1 ^ set2 对称差集((set1|set2)-(set1&set2))
print(set1 ^ set2)
print((set1 | set2) - (set1 & set2))
# 5. 子集
print({10, 20, 30, 40} > {10, 40})  # True
print({10, 20, 30} > {10, 20, 30})  # False真子集
print({10, 20, 30} >= {10, 20, 30})  # True子集

数字数据

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))

python的复数直接支持复数运算

b = 5 - 6j
print(a + b)

2. 数学模块

import math  
import cmath  #为复数提供的

1) ceil - 把浮点数转化成整数 - 上取整

num = 3.15
# 将浮点数转换成整数
# 1)int(浮点数) - 直接去掉小数和小数点后面的数
print(int(num))
# 2) math.ceil(浮点数)
print(math.ceil(num))   #上取整   4
print(math.ceil(-3.13))  #  -3
print(math.copysign(-4,-2))    # 前面一个数提供绝对值,后面一个提供符号

2)math.floor(浮点数) - 下取整

print(math.floor(1.5))
print(math.floor(-2.3))

3)round(浮点数) - 四舍五入

print(round(2.51))
print(round(2.6))
print(round(2.4))

4)math.fabs(数字) - 获取数字的绝对值

print(math.fabs(-232))  
print(abs(-23))

5)factorial - 阶乘

print(math.factorial(5))

作业

  1. 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
    1. 统计不及格学生的个数
    2. 打印不及格学生的名字和对应的成绩
    3. 统计未成年学生的个数
    4. 打印手机尾号是8的学生的名字
    5. 打印最高分和对应的学生的名字
    6. 删除性别不明的所有学生
    7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
Students = [
   {'name': '张三', 'age': 18, 'score': 80, 'tel': 15283102478, 'sex': 'M'},
   {'name': '李四', 'age': 19, 'score': 58, 'tel': 15283102478, 'sex': 'F'},
   {'name': '王五', 'age': 21, 'score': 78, 'tel': 15283102477, 'sex': 'N'},
   {'name': '赵六', 'age': 21, 'score': 58, 'tel': 15283102476, 'sex': 'F'},
   {'name': '可莉', 'age': 7, 'score': 94, 'tel': 15283102474, 'sex': 'F'},
   {'name': '小李', 'age': 15, 'score': 66, 'tel': 15283102428, 'sex': 'N'}
]
fail_num = 0
under_age = 0
high = Students[0]
eight_tel = []
for x in Students:
   if x.get('score') < 60:
       fail_num += 1
       print('不及格的学生姓名:', x.get('name'), '成绩:', x.get('score'))
   if int(x.get('age')) < 18:
       under_age += 1
   if x.get('tel') % 10 == 8:
       eight_tel.append(x.get('name'))
   if high.get('score') < x.get('score'):
       high = x

print('未成年有:', under_age, '个')
print('手机尾号是8的人:', eight_tel)
print('成绩最高的学生:', high.get('name'))
print('删掉不明性别之后:', end='')
normal_student = [x for x in Students if x.get('sex') != 'N']
print(normal_student)
print('成绩由高到低:', end='')
sort_student = sorted(Students, key=lambda Student: Student['score'], reverse=True)
print(sort_student)
  1. 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
    1. 求选课学生总共有多少人
    2. 求只选了第一个学科的人的数量和对应的名字
    3. 求只选了一门学科的学生的数量和对应的名字
    4. 求只选了两门学科的学生的数量和对应的名字
    5. 求选了三门学生的学生的数量和对应的名字
set_math = {'小李', '小钟', '小温', '小迪', '小可', '小莉', '小离', '小琴', '小斗'}
set_python = {'小钟', '小温', '小泽', '小雷', '小莉', '小离', '小琴', '小拉', '小魈'}
set_c = {'小雷', '小莉', '小离', '小琴', '小拉', '小诺', '小艾', '小北', '小琴'}
# 1.选课学生总人数 并集
set_tol = set_c | set_python | set_math
print('选课学生:', set_tol)
print('选课人数:', len(set_tol))
# 2.只选了第一个学科的人的数量和对应名字  并集-python-c
set_first = set_tol - set_c - set_python
print('只选了第一个课的学生总数:', len(set_first), ',学生姓名:', set_first)
# 3.只选了一个课的学生数量和名字
set_sec = set_tol - set_c - set_math
set_thi = set_tol - set_python - set_math
set_one = set_first | set_sec | set_thi
print('只选了一个课的学生:', set_one, '学生数量', len(set_one))
# 4.只选了两个课的学生数量和名字 = 全部 - 一个 - 三个
set_thid = set_c & set_math & set_python
set_two = set_tol - set_one - set_thid
print('只选了两个课的学生:', set_two, '学生数量', len(set_two))
print('选了三个课的学生:', set_thid, '学生数量', len(set_thid))
  1. 学生管理系统
# 学生管理系统
id = 1
Student = []
admin = input('请输入名字:')
while id != '5':
    flag = 1
    print('===============================================================\n❀❀欢迎', admin, ':\n', sep='')
    print('==========                 1.添加学生                 ==========')
    print('==========                 2.查看学生                 ==========')
    print('==========                 3.修改信息                 ==========')
    print('==========                 4.删除学生                 ==========')
    print('==========                 5.退出系统                 ==========')
    print('===============================================================')
    id = input('请选择1——5:')
    while id == '1' and flag == 1:
        tmp = {}
        tmp.setdefault('num', input('请输入学生学号:'))
        tmp.setdefault('name', input('请输入学生姓名:'))
        tmp.setdefault('age', input('请输入学生年龄:'))
        tmp.setdefault('tel', input('请输入学生电话:'))
        for i in range(len(Student)):
            if tmp['num'] == Student[i]['num']:
                print('该学号已存在!')
                break
        else:
            Student.append(tmp)
            print('添加成功!')
        print('==========                 1.继续添加                 ==========')
        print('==========                 2.返回系统                 ==========')
        flag = int(input('请选择(1-2):'))
    while id == '2' and flag == 1:
        print('==========                 1.所有学生                 ==========')
        print('==========                 2.姓名查找                 ==========')
        print('==========                 3.学号查找                 ==========')
        print('==========                 4.返回系统                ==========')
        id_2 = input('请选择1-4:')
        if id_2 == '1':  # 所有学生信息
            print('学生信息如下:\n', Student)
        elif id_2 == '2':  # 按姓名查找
            tmp_name = input('请输入查找的姓名:')
            name_list = [x for x in Student if x.get('name') == tmp_name]
            print(name_list)
        elif id_2 == '3':
            tmp_num = input('请输入查找的学号:')
            num_list = [x for x in Student if x.get('num') == tmp_num]
            print(num_list)
        else:
            flag = 2
    while id == '3' and flag == 1:
        tmp_num = input('请输入修改学生的学号:')
        for i in range(len(Student)):
            if Student[i].get('num') == tmp_num:
                print('已找到需要修改的学生,请选择修改的项目:')
                print('==========                 1.学生学号                 ==========')
                print('==========                 2.学生姓名                 ==========')
                print('==========                 3.学生年龄                 ==========')
                print('==========                 4.学生电话                 ==========')
                print('==========                 5.返回系统                 ==========')
                id_3 = input('请选择1-5:')
                if id_3 == '1':  # 改学号
                    tmp = input('请输入新的学号:')
                    for i in range(len(Student)):
                        if tmp == Student[i]['num']:
                            print('该学号已存在!')
                            break
                    else:
                        Student[i]['num'] = tmp
                        print('修改成功!')
                elif id_3 == '2':  # 改姓名
                    Student[i]['name'] = input('请输入新的姓名:')
                    print('修改成功!')
                elif id_3 == '3':  # 改年龄
                    Student[i]['age'] = input('请输入新的年龄:')
                    print('修改成功!')
                elif id_3 == '4':  # 改电话
                    Student[i]['tel'] = input('请输入新的电话:')
                    print('修改成功!')
                else:
                    flag = 2
                    break
        print('==========                 1.继续修改                 ==========')
        print('==========                 2.返回系统                 ==========')
        flag = int(input('请选择(1-2):'))
    while id == '4' and flag == 1:
        print('删除学生信息:')
        tmp_num = input('请输入删除学生的学号:')
        for i in range(len(Student)):
            if Student[i].get('num') == tmp_num:
                del Student[i]
                break
        else:
            print('该生不存在')
        print('==========                 1.继续删除                 ==========')
        print('==========                 2.返回系统                 ==========')
        flag = int(input('请选择(1-2):'))
print('退出系统成功,欢迎下次使用!')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值