day7-字典和集合

本文深入探讨了Python字典的数据结构特性,包括字典的定义、键值对、不可变性、无序性等。介绍了如何通过键进行数据的增删改查,以及字典的遍历方法。此外,还展示了字典在实际问题中的应用,如统计不及格学生人数和计算平均分。最后,讲解了字典的其他操作,如更新、合并、转换为列表等,并对比了集合的相关概念和操作。
摘要由CSDN通过智能技术生成

字典

  1. 字典存在的价值 - 可以同时保存多个意义不同的数据的时候,通过key来对数据进行区分和说明

  2. 什么是字典(dict)

    字典是容器型数据类型;将{}作为容器的标志,里面多个元素(元素是键值对)用逗号隔开;

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

    字典的元素:必须是键值对,

    ​ 键 - 必须是不可变数据,一般用字符串;唯一的。(功能是对值进行说明)

    ​ 值 - 任何类型的数据都可以,可以重复。(值才是字典真正想要保存的数据)

    特点:字典是可变的(支持增删改);是无序的(不支持下标)

    dict1 = {}  # 空字典
    print(type(dict1),dict1)    # <class 'dict'> {}
    

    键不可变

    d2 = {'abc':100,12:200,(10,20):300}
    print(d2)
    # d3 = {'abc':100,12:200,[10,20]:300}   -  报错! 列表不能作为key
    

    键是唯一的

    d4 ={'name':'小明','name':'小花','age':18}
    print(d4)   # {'name': '小花', 'age': 18}
    

    值是任何类型的数据

    d5 ={'k1':12,'k2':'abc','k3':(10,20),'k4':9.21,'k5':[30,40],'k6':{'a':'a'}}
    print(d5)
    

    字典无序

    d6 = {'name':'张三','age':30}
    d7 = {'age':30,'name':'张三'}
    print(d6 == d7) # True
    

元素的增删改查

  1. 查 - 获取字典的值

    1. 查单个值

      字典[key] - 获取字典中指定key对应的值;如果key不存在会报错

      字典.get(key) - 获取字典中指定key对应的值,如果key不存在不会报错,并会返回值:None

      字典.get(key,默认值) - 获取字典中指定key对应的值;如果key不存在不会报错,把默认值返回

      dog = {'name':'旺财','sex':'公狗','color':'黄色','breed':'土狗','age':2}
      
      print(dog['name'],dog['breed'])
      # print(dog['height'])  - 报错!  KeyError: 'height'
      
      print(dog.get('age'))
      print(dog.get('height'))    # None
      
      print(dog.get('color','黑色'))    # 黄色
      print(dog.get('height',0))  # 0
      
    2. 遍历

      for 变量 in 字典:

      ​ 循环体

      注意:变量取到的是字典的每个key

      dog = {'name':'旺财','sex':'公狗','color':'黄色','breed':'土狗','age':2}
      for x in dog:
          print('x:',x,dog.get(x))
      
  • 练习:

    • 统计班级中不及格学生的人数
    • 计算所有学生的平均分
    classes = [
        {'name': 'stu1', 'age': 26, 'score': 90, 'sex': '男'},
        {'name': 'stu2', 'age': 13, 'score': 89, 'sex': '女'},
        {'name': 'stu3', 'age': 22, 'score': 77, 'sex': '女'},
        {'name': 'stu4', 'age': 34, 'score': 56, 'sex': '男'},
        {'name': 'stu5', 'age': 15, 'score': 34, 'sex': '女'},
        {'name': '小明',  'age': 20, 'score': 70, 'sex': '女'}
    ]
    count = 0
    sum1 = 0
    for item in classes:
        if item['score'] < 60:
            count += 1
        sum1 += item['score']
    print(count,sum1 / len(classes))
    
  1. 增/改 - 添加键值对/修改键对应的值

    1. 字典[key] = 值 - 如果key不存在就是添加key值;如果key存在就是修改指定key对应的值

      增加

      computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
      computer['cpu_num'] = 4
      print(computer)  #  {'brand': '联想', 'color': '灰色', 'price': 5300, 'RAM': 16, 'cpu_num': 4}
      

      修改

      computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
      computer['color'] = '黑色'
      print(computer)	 # {'brand': '联想', 'color': '黑色', 'price': 5300, 'RAM': 16, 'cpu_num': 4}
      
    2. 字典.setdefault(key,value) - 添加键值对(只能添加,不呢个修改)

      computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
      computer.setdefault('size',14)
      print(computer)  # {'brand': '联想', 'color': '黑色', 'price': 5300, 'RAM': 16, 'cpu_num': 4, 'size': 14}
      
  2. 删 - 删除键值对

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

      computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
      del computer['RAM']
      print(computer)	# {'brand': '联想', 'color': '灰色', 'price': 5300}
      
      # 如果key不存在会报错
      # del computer['name']  - KeyError: 'name'
      # del computer['联想']    - KeyError: '联想'
      
    2. 字典.pop(key) - 取出指定key对应的值,并且返回key对应的值

      computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
      color = computer.pop('color')
      print(color,computer)  # 灰色 {'brand': '联想', 'price': 5300, 'RAM':16}
      

字典相关操作

  1. 运算符

    字典不支持+、*、>、<、>=、<=、,只支持 ==、 !=

    # print({'a':10} > {'a':20})  - TypeError: '>' not supported between instances of 'dict' and 'dict'
    
    d1 = {'a':10, 'b':20}
    d2 = {'b':20, 'a':10}
    print(d1 == d2) # True
    
  2. in 和 not in

    key in 字典 - 判断字典中是否存在指定的key

    d3 = {'a':10, 'b':20, 'c':30}
    print('a' in d3)    # True
    print(10 in d3)     # False
    
  3. 相关函数

    (了解)sum、max、min、sorted - 针对的操作对象是字典的key

    len、dict

    1. len(字典) - 获取字典中键值对的个数
    d3 = {'a':10, 'b':20, 'c':30}
    print(len(d3))	# 3
    
    1. dict(数据) - 将指定数据转换成字典

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

      ​ b.序列中的每一个元素是小序列

      ​ c.小序列中元素的个数是2

      ​ d.小序列的第一个元素不可变

      seq = [(1,2),(10,20),(100,200),('abc',123),'ab']
      d4 = dict(seq)
      print(d4)	# {1: 2, 10: 20, 100: 200, 'abc': 123, 'a': 'b'}
      ['
      

    字典转列表 - 将字典的key作为列表元素

    computer = {'brand':'联想','color':'灰色','price':5300,'RAM':16}
    print(list(computer))   # ['brand', 'color', 'price', 'RAM']
    

字典相关方法

  1. 字典.clear() - 清空字典

  2. 字典.copy() - 复制字典产生一个一模一样的新字典并返回

    p1 = {'name':'小明','age':18,'gender':'男'}
    p3 = p1.copy()
    p1['name'] = '小花'
    print(p3)	# {'name': '小明', 'age': 18, 'gender': '男'}
    
  3. (了解)

  • dict.fromkeys(序列,值) - 创建一个新的字典,将序列中元素作为字典的key,每个key对应的值就是指定值

  • dict.fromkeys(序列) - 创建一个新的字典,将序列中元素作为字典的key,每个key对应的值都是None

    d1 = dict.fromkeys('abc',12)
    print(d1)
    d2 = dict.fromkeys(['name','age','sex'])
    print(d2)
    
  1. 字典.items() - (同时获取字典的key和值)将字典转换成一个序列,序列中的元素是每个键值对对应的小序列

    stu = {'name':'小明', 'age':18, 'gender':'男', 'score':90}
    print(stu.items())  # dict_items([('name', '小明'), ('age', 18), ('gender', '男'), ('score', 90)])
    print(list(stu.items()))  # [('name', '小明'), ('age', 18), ('gender', '男'), ('score', 90)]
    

    遍历字典的时候同时获取键和值(效率低)

    for key,value in stu.items():
        print(key,value)
    
  • 练习:通过列表推导式交换key和value的值

    dict1 = {'a':10,'b':20, 'c':30}
    
    list1 = dict([(value, key) for key, value in dict1.items()])
    print(list1)
    
    list2 = dict([(dict1[key], key) for key in dict1])
    print(list2)
    
  1. 字典.keys() - 获取字典所有的key(返回一个序列)

    dict1 = {'a':10,'b':20, 'c':30}
    print(dict1.keys()) # dict_keys(['a', 'b', 'c'])
    
  2. 字典.values() - 获取字典所有的值(返回一个序列)

    dict1 = {'a':10,'b':20, 'c':30}
    print(dict1.values())   # dict_values([10, 20, 30])
    
  3. 字典.update(序列) - 将序列中所有的元素以键值对的形式添加到字典中

    ​ 序列:必须是可以转换成字典的序列

    dict2 = {'a':10,'b':20, 'c':30}
    dict2.update({100:20, 200:30})
    print(dict2)	# {'a': 10, 'b': 20, 'c': 30, 100: 20, 200: 30}
    
    dict2 = {'a':10,'b':20, 'c':30}
    dict2.update([(10,20), 'ab'])
    print(dict2)	# {'a': 'b', 'b': 20, 'c': 30, 10: 20}
    

集合

  1. 什么是集合(set)?

    容器:将{}作为容器的标志,多个元素用逗号隔开:{元素1, 元素2, 元素3, …}

    元素:不可变的、唯一的(集合自带去重功能)

    特点:可变的、无序的

    1. 空集合

      s1 = {} # {}是空字典不是空集合
      print(type(s1)) # <class 'dict'>
      

      空集合

      s2 = set()
      print(type(s2),len(s2)) # <class 'set'> 0
      
    2. 集合元素不可变

      s3 = {90,'abc', (1, 2)}
      print(s3)
      
      # s4 = {90,'abc', [1, 2]}
      # print(s4)   - TypeError: unhashable type: 'list'
      
    3. 集合元素是唯一的

      s5 = {1, 2, 3, 1, 1, 3}
      print(s5)   # {1, 2, 3}
      
      l1 = ['张三', '李四', '王五', '张三', '王五']
      s6= set(l1)
      print(list(s6))
      
  2. 数学集合运算:并集(|)、交集(&)、差集(-)、对称差集(^)、子集(>=)、真子集(>)

    1. 并集 - A和B的并集是将A和B的元素放在一起构成的集合

      A = {1, 2, 3, 4, 5, 6}
      B = {4, 5, 6, 7, 8}
      C = A | B
      print(C)    # {1, 2, 3, 4, 5, 6, 7, 8}
      
    2. 交集 - A和B的交集,写作A&B,是即属于A的,又属于B的所有元素组成的集合

      A = {1, 2, 3, 4, 5, 6}
      B = {4, 5, 6, 7, 8}
      C = A & B
      print(C)    # {4, 5, 6}
      
    3. 差集 - 两个集合相减,写作B-A,是属于B的,但不属于A的所有元素组成的集合

      A = {1, 2, 3, 4, 5, 6}
      B = {4, 5, 6, 7, 8}
      C = B - A
      print(C)    # {8, 7}
      
    4. 对称差集 - 在集合A和集合B中,只包含在A中和只包含在B中的元素的集合

      A = {1, 2, 3, 4, 5, 6}
      B = {4, 5, 6, 7, 8}
      C = A ^ B
      print(C)    # {1, 2, 3, 7, 8}
      
    5. 子集 :>= - 判断是否是子集;> - 判断是否是真子集

      A = {1, 2, 3, 4, 5}
      B = {4 ,5}
      print(A >= B)   # True
      print(A > B)    # True
      
      C = {4, 5}
      print(B >=C)    # True
      print(B > C)    # False
      
      D = {1,7}
      print(A > D)    # False
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值