day7-字典和集合

总结

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
    
    # 3) 键是不可变的
    print({10: 20, 'abc': 100, (1, 2): 300})
    # print({10: 20, 'abc': 100, [1, 2]: 300})  报错
    
    # 4) 键是唯一的
    print({10: 20, 'abc': 30, 10: 40, 'abc': 50})   # {10: 40, 'abc': 50}
    
2. 字典的增删改查
  • 查 - 获取值

    1. 查单个

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

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

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

      dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
      print(dog['name'])  # 财财
      print(dog['age'])   # 2
      print(dog.get('breed'))  # 土狗
      # print(dog['height'])   KeyError: 'height'
      print(dog.get('height'))  # None
      print(dog.get('height', 40))   # 40
      print(dog.get('weight', 15))   # 15
      
    2. 遍历

      """
      for 变量 in 字典:
          循环体
      注意:变量取到的是字典的键
      """
      dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
      for x in dog:
          print(x)
          print(x, dog[x])
      
  • 增, 改

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

    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}
    
  • 删 - 删除不存在的键, 会报错

    1. del 字典[键] - 删除字典中指定键对应的键值对

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

      dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
      dog.pop('gender')
      print(dog)  # {'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 序列}
      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}

      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, 比较第一对不相等的元素的大小
      
  • in 和 not in

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

    2. 键 not in 字典

      cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
      print('咖啡' in cat)   # False
      print('name' in cat)  # True
      
  • 相关函数: len, dict

    1. len

      cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
      print(len(cat))   # 3
      
    2. dict(数据) - 将指定数据转换成字典

      数据的要求:

      1. 数据本身是一个序列

        				 2. 序列中的元素必须是有且只有两个元素的小序列
          					 3. 小序列中的元素必须是不可变的数据
        
      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}
      
    3. 字典转列表

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

    1. 字典.clear()

      cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
      cat.clear()
      print(cat)   # {}
      
    2. 字典.copy()

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

      cat = {'name': '咖啡', 'color': '白色', 'breed': '折耳'}
      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)  # 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}
      
    5. 字典.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}
      
4. 实际开发中的字典
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 stu in cl['students']:
    print(stu['linkman']['tel'])
# 打印所有老师的名字
for tea in cl['teachers']:
    print(tea['name'])
# 给所有的紧急联系人添加性别,性别默认是男
for stu in cl['students']:
    stu['linkman']['gender'] = '男'
5. 集合
  • 什么是集合(set):

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

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

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

    # 1) 空集合
    set1 = set()
    print(set1, type(set1), len(set1))   # set() <class 'set'> 0
    # 2) 集合无序
    print({1, 2, 3} == {3, 2, 1})  # True
    # 3) 集合的元素是不可变的数据
    print({10, 'abc', (2, 3)})  # {(2, 3), 10, 'abc'}
    # 4) 集合元素是唯一的
    print({10, 20, 30, 10, 10, 20})  # {10, 20, 30}
    
    names = ['张三', '李四', '张三', '小明', '张三', '李四']
    print(set(names))  # {'李四', '小明', '张三'}
    
  • 集合的增删改查

    1. 查 - 只有遍历
    nums = {10, 89, 23, 52, 87, 99, 46, 62}
    print(list(nums))  # 转换成列表[99, 10, 46, 52, 23, 87, 89, 62]
    for x in nums:
        print(x)
    
    1. 集合.add(元素) - 在集合中添加指定元素

    nums = {10, 89, 23, 52, 87, 99, 46, 62}
    # 集合.add(元素)  -  在集合中添加指定元素
    nums.add(100)
    print(nums)  # {99, 100, 10, 46, 52, 23, 87, 89, 62}
    
    # 集合.update(序列)  -  将序列中所有元素都添加到集合中
    nums.update('abc')
    print(nums)  # {'c', 'b', 99, 100, 10, 46, 52, 23, 87, 89, 'a', 62}
    
    1. 集合集合.remove(元素) - 删除指定元素, 元素不存在报错

      集合.discard(元素) - 删除指定元素, 元素不存在不会报错

    nums = {10, 89, 23, 52, 87, 99, 46, 62}
    # nums.remove(100)
    # print(nums)   # KeyError: 100
    nums.discard(100)
    print(nums)  # {99, 10, 46, 52, 23, 87, 89, 62}
    
6. 数学集合运算
  • 数学集合运算: &(交集), |(并集), -(差集), ^(对称差集), ><(判断是否是真子集), >=<=(判断是否是子集)
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.子集
# 集合1 > 集合2  -  判断集合2是否是集合1的真子集
# 集合1 >= 集合2  -  判断集合2是否是集合1的子集
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
7.数字数据了解
  • python中数字相关类型有4种: int, float, bool, complex

  • True == 1, False == 0

  • 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)  # (5+8j)
    print(a * b)  # (62-50j)
    
  • 数学模块

import math

import cmath

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

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

    print(math.ceil(1.99))  # 2
    print(math.ceil(1.22))  # 2
    print(math.ceil(2.001)) # 3
    print(math.ceil(-3.001)) # -3
    
  • math.floor(浮点数) - 向小取整

    print(math.floor(1.99))   # 1
    print(math.floor(1.001))  # 1
    print(math.floor(-2.999)) # -3
    
  • round(浮点数) - 四舍五入

    print(round(2.999))  # 3
    print(round(2.110))  # 2
    print(round(-3.001)) # -3
    print(round(-3.67))  # -4
    
  • math.fabs(数字) - 获取数字的绝对值

    print(math.fabs(-23))  # 23.0
    print(math.fabs(12))   # 12.0
    
  • abs(数字) - 获取数字的绝对值

    print(abs(-23))  # 23
    print(abs(-2.3)) # 2.3
    

作业

  1. 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )

    students = [
        {'name':'小明', 'age':20, 'score': 100, 'tel': '102311111', 'gender': '男',},
        {'name':'小日', 'age':10, 'score': 80, 'tel': '102322228', 'gender': '不明',},
        {'name':'小月', 'age':12, 'score': 90, 'tel': '102333333', 'gender': '女',},
        {'name':'小红', 'age':13, 'score': 92, 'tel': '102344448', 'gender': '女',},
        {'name':'小绿', 'age':14, 'score': 78, 'tel': '102355555', 'gender': '男',},
        {'name':'小蓝', 'age':17, 'score': 50, 'tel': '102366666', 'gender': '男',},
    ]
    # 1.统计不及格学生的个数
    conut = 0
    for x in students:
        if x['score'] < 60:
            conut += 1
            print('不及格学生个数:', conut)
            
    # 2.打印不及格学生的名字和对应的成绩
    for x in students:
        if x['score'] < 60:
            print(x['name'], x['score'])
            
    # 3.统计未成年学生的个数
    conut = 0
    for x in students:
        if x['age'] < 18:
            conut += 1
            print('未成年学生个数:', conut)
            
    # 4.打印手机尾号是8的学生的名字  
    for x in students:
        if int(x['tel']) % 10 == 8:
            print(x['name'])
            
    # 5.打印最高分和对应的学生的名字
    max_score = x['score']
    for x in students:
        if x['score'] > 0:
            if x['score'] > max_score:
                max_score = x['score']
                print(max_score, x['name'])
    
    # 6.删除性别不明的所有学生
    for x in students:
        if x['gender'] == '不明':
            del x['gender']
    
    # 7.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃) 
     
    
  2. 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)

    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)
    stu3 = math - (eng | ch)
    stu4 = eng - (ch | math)
    stu5 = stu2 | stu3 | stu4
    print(len(stu5), stu5)
    
    # 4.求只选了两门学科的学生的数量和对应的名字
    stu6 = eng - (ch & math)
    stu7 = ch - (math & eng)
    stu8 = math - (eng & ch)
    print(len(stu8), stu8)
    # 5.求选了三门学生的学生的数量和对应的名字
    stu9 = stu - stu5 - stu8
    print(len(stu9), stu9)
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值