day7 字典以及集合

day7 字典以及集合

字典

  1. 什么是字典、

    • 字典是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开(每个元素是键值对): {键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, 'avc': 100, (1 , 2):300})
        # print({10: 20, 'avc': 100, [1 , 2]:300})  #报错
        
      4. 键是唯一

        print({10: 20, 'avc': 30, 10: 40, 'avc': 50})   #{10: 40, 'avc': 50}
        
  2. 字典的相关操作

    1. 查 - 获取值

      1. 查单个:

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

          dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
          print(dog['name'])
          print(dog['age'])
          
        • 字典.get(键) - 获取字典中指定键对应的值, 键不存在不会报错,返回None

          print(dog.get('breed'))
          
          # print(dog['height'])    #KeyError: 'height'
          print(dog.get('height'))    #None
          
        • 字典.get(键,默认值) - 获取字典中指定键对应的值,键不存在不会报错,返回指定默认值

          print(dog.get('height', 40))    #40
          
      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': '女'}
          ]
          

          练习:统计未成年的人数

          count1 = 0
          for x in students:
              if x['age'] < 18:
                  count1 += 1
          print(count1)
          

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

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

      • 字典[键] = 值 - 当键不存在时,添加键值对;当键存在时,修改指定键对应的值

        dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
        print(dog)
        

        添加

        dog['weight'] = 10
        print(dog) #{'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10}
        

        修改

        dog['name'] = '旺财'
        print(dog) #{'name': '旺财', 'breed': '土狗', 'gender': '母狗', 'age': 2, 'weight': 10}
        
      • del 字典[键] - 删除字典中指定键对应的键值对

        dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
        del dog['breed']
        print(dog)
        
      • 字典.pop(键) - 取出字典中指定键对应的值

        dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
        del_val = dog.pop('gender')
        print(dog,del_val)
        

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

        dict1 = {'a': 'b', 'c': 'd', 'e': 'f'}
        # 法一:
        dict2 = {}
        for x in dict1:
            dict2[dict1[x]] = x
        # 法二:
        # 字典推导式: {键:值 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}
        # list1 = [x for x in  list2]
        dict1 = {x:x*2 for x in range(2, 6)}
        print(dict1)
        
        dict2 = {x:x*11 for x in range(2,6)}
        print(dict2)
        
  3. 字典的方法

    1. 运算符

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

      print([1, 2, 3,  4, 5] > [10, 20])  #False, 比较第一对不相等的元素的大小 1 < 10
      
    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)
      

      字典转列表

      cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
      print(list(cat))    #['name', 'color', 'breed']
      
    4. 字典相关方法

      • 字典.clear()

        cat.clear()
        print(cat)
        
      • 字典.copy()

        cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
        cat2 = cat.copy()
        print(cat2, id(cat), id(cat2))
        
      • keys values items

        • 字典.keys() - 获取字典所有的键,返回值是序列
        • 字典.values() - 获取字典所有的值,返回值是序列
        • 字典.items() - 将字典转换成元素是元组的序列(一个键值对对应一个元组)
        print(cat.keys())   #dict_keys(['name', 'color', 'breed'])
        print(cat.values()) #dict_values(['咖啡', '白色', '折耳'])
        print(cat.items())  #dict_items([('name', '咖啡'), ('color', '白色'), ('breed', '折耳')])
        
        for x, y in cat.items():
            print(x, y)
        
      • 字典.setdefault(键, 值) - 添加键值对(键存在时不会修改)

        cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
        cat.setdefault('weight', 10)
        print(cat)
        cat.setdefault('color', '黑色')
        print(cat)
        
      • 字典.update(序列) - 将序列中的元素添加到字典中(序列必须是可以转换成字典的序列)

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

        cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
        cat.update([(10, 20), 'ab'])
        print(cat)
        
        cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
        cat.update({'a': 10, 'b': 20, 'color': '黑色'})
        print(cat)
        
        cl = {
            'name': 'python2103',
            'address': 'classroom 6',
            'students': [
                            {'name': 'stu1',
                             'age': '15',
                             'tel': '46546',
                             'gender': '男',
                             'linkman': {'name': '张三', 'tel': '4124'}
                             },
                            {'name': 'stu2',
                             'age': '13',
                             'tel': '41446',
                             'gender': '男',
                             'linkman': {'name': '李四', 'tel': '11744'}
                             }
                      ],
            'teacher':[
                {'name': '玉婷', 'job': '讲师','qq': '74596321'},
                {'name': '淑玲', 'job': '班主任','qq': '14241471'}
                        ]
        
        }
        # 打印所有学生的紧急联系人的电话
        # 打印所有老师的名字
        stu = cl.get('students')
        tel = [x['tel'] for x in stu]
        print(tel)
        

集合

  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]})  #TypeError: unhashable type: 'list'
        
      4. 集合元素是唯一的

        print({10, 20, 30, 10, 10, 20})     #{10, 20, 30}
        
        names = ['张三', '李四', '张三', '王麻子', '张三', '李四']
        print(set(names))
        
  2. 集合的增删改查

    • 查 - 只有遍历

      nums = {10, 78, 67, 35, 71, 89}
      for x in nums:
          print(x)
      
      • 集合.add(元素) - 在集合中添加指定元素
      • 集合.update(序列) - 将序列中的所有元素都添加到集合中
      nums.add(100)
      print(nums)
      
      nums.update('adc')
      print(nums)
      
      nums.update({'name': '张三', 'age': 18})
      print(nums)
      
      • 集合.remove(元素) - 删除指定元素, 元素不存在报错
      • 集合.discard(元素) - 删除指定元素, 元素不存在不会报错
      nums = {10, 78, 67, 35, 71, 89}
      nums.remove(10)
      print(nums)
      
      nums.discard(35)
      print(nums)
      
      # nums.remove(1000)
      # print(nums)
      #
      nums.discard(1000)
      print(nums)
      
  3. 集合的数学运算

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

      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中除了包含在集合2中以外的元素)

        print(set1 - set2)  #{1, 2, 3}
        print(set2 - set1)  #{8, 7}
        
      4. 集合1 ^ 集合2 - 对称差集(集合1和集合2合并,再去掉公共部分)

        print(set1 ^ set2)  #{1, 2, 3, 7, 8}
        
      5. 子集

        print({10, 20, 30, 40} > {1, 2} )   #False
        print({10, 20, 30, 40} > {10, 20} )   #True
        print({10, 20} > {10, 20} )   #False
        print({10, 20} >= {10, 20} )   #True
        

补充

数字数据

  • python 中数字相关的类型有4种:int、float、bool、complex

    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. 数学模块

      将浮点数转整数

      • int(浮点数) - 直接去掉小数点和小数点后面的数

        print(int(num))
        
      • math.ceil(浮点数) - 向大取整

        print(math.ceil(1.99))  #2
        print(math.ceil(1.09))  #2
        print(math.ceil(-0.14)) #0
        
      • math.floor(浮点数) - 向小取整

        print(math.floor(1.57))     #1
        print(math.floor(1.001))    #1
        print(math.floor(-4.57))    #-5
        
      • round(浮点数) - 四舍五入

        print(round(1.99))      #2
        print(round(1.002))     #1
        print(round(-4.37))     #-4
        

      获取数字绝对值

      • math.fabs(数字) - 获取数字的绝对值,结果是i浮点数

        print(math.fabs(-24))   # 24.0
        
      • abs(数字) - 获取数字绝对值

        print(abs(-21))     #21
        print(abs(1.27))    #1.27
        

作业

from random import randint


# 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
# all_names = ['小明', '小何', '小玖', '小晴', '小王', '小李', '小青', '赵宇', '风琴', '苍梧', '青枫', '梦雪']
# ch_stus = {all_names[randint(0, 11)] for _ in range(10)}
# manth_stus = {all_names[randint(0, 11)] for _ in range(10)}
# eng_stus = {all_names[randint(0, 11)] for _ in range(10)}
# print('ch:',ch_stus)
# print('math:',manth_stus)
# print('eng:',eng_stus)

ch = {'苍梧', '青枫', '小玖', '小何', '小王', '小明', '赵宇'}
math = {'青枫', '苍梧', '风琴', '小玖', '小何'}
eng = {'小李', '青枫', '苍梧', '风琴', '小晴', '小何', '小青', '梦雪'}


# 1. 求选课学生总共有多少人
stu = ch | math |eng
print(len(stu))

# 2. 求只选了第一个学科的人的数量和对应的名字
stu1 = ch - (math | eng)
print('只选了第一个学科的人的数量:',len(stu1),'学生名字:',stu1)

# 3. 求只选了一门学科的学生的数量和对应的名字
stu2 = (ch - (math | eng)) | (math - (ch | eng)) | (eng - (ch | math))
print('只选了一门学科的学生的数量:',len(stu2),'学生姓名:',stu2)

# 4. 求只选了两门学科的学生的数量和对应的名字
stu3 = ((ch & math) - eng) | ((ch & eng) - math) | ((eng & math) - ch)
print('只选了两门学科的学生的数量:',len(stu3),'学生姓名:',stu3)

# 5. 求选了三门学生的学生的数量和对应的名字
stu4 = ch & math & eng
print('选了三门学生的学生的数量:',len(stu4),'学生姓名:',stu4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值