day07-字典以及集合

总结

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}
      
  • 字典的增删改查

      1. 查单个值:

        • 字典[键] - 获取字典中指定键对应的值,键不存在报错(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
        
      2. 遍历

        '''
        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 = {'小明', '青枫', '苍梧', '小青', '小何', '赵宇', '小王', '小玖'}
  1. 求选课学生总共有多少人

    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))
    
  2. 求只选了第一个学科的人的数量和对应的名字

    set1 = ch_stu - (ch_stu & eng_stu) - (ch_stu & math_stu)
    print('人数:', len(set1), '姓名:', *set1)
    
  3. 求只选了一门学科的学生的数量和对应的名字

    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))
    
  4. 求只选了两门学科的学生的数量和对应的名字

    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))
    
  5. 求选了三门学生的学生的数量和对应的名字

    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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值