day7 字典和集合-5.07

回顾

day 5 - 05.06

# 1.  相关函数  max min sum sorted  reversed len  list
#  soreted 从小到大
# 序列 可以转换成列表
# 2相关方法
list
# 3 推导式
#  变换 -> [表达式 for 变量 in 序列]
#  部分变换 -> [三目运算符  for 变量 in 序列]
# 筛选 删除 -> [表达式 for 变量 in序列 if 条件语句]

# 4.元组
# (元素1,元素2,元素3,...)
# 不可变 (不能增删改) ; 有序(支持下标操作)
# 任何类型的数据都可以作为元组元素
t1 = (23,)
t2 = 13,35,6,7,'sd'
t3 = (13,34,46)
x,y,z = t3
x,y,z = 13,34,46
a,*b,c = 12,3,6,56,78,56

总结

1. 什么是字典 dict

'''
字典是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开
	(每个元素必须是键值对):{键1:值,键2:值,...}
字典是可变的(支持增删改);字典是无序(不支持下标操作)
键:必须是不可变的数据(数字、字符串、元组)(列表、字典可变)
键是唯一的
值:值才是字典真正想要保存的数据,键的做用就像列表的下标,来对值进行区别和说明,
值可以是任何类型的数据

'''
  1. 空字典
  • 空元组没有意义,空列表和空字典是有意义的

  • ict1 = {}
    print(dict1,type(dict1),len(dict1))
    
  1. 字典无序
  • print([1,2,3] ==[3,2,1])  #False
    print({'a':1,'b':2} == {'b':2,'a':1})  #True
    
  1. 键是不可变的
  • print({12:23,'23':33,(1,3):23})
    # print({12:23,'23':33,[1,3]:23})  报错 列表是可变的
    

4.键是唯一值

  • print({12:23,'23':33,12:34,'23':3}) #{12: 34, '23': 3}
    

2.字典增删改查

  1. 查 - 获取值

    1. 查单个

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

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

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

    dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2}
    print(dog['name'])   #旺财
    print(dog.get('breed')) #土狗
    print(dog.get('bre')) #None
    print(dog.get('bre',3)) #3
    
    
    1. 遍历
    '''
    for 变量  in字典:
        循环体
    zhu注意:变量取到的是字典的键    
    '''
    x = {'a':23}
    dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2}
    for x in dog:
        print(x,dog[x],sep=' ',end=' ')
        
    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': '女'}
    ]
    # 练习:统计未成年的人数
    count = 0 
    for x in students:
        if x['age'] < 18:
            count += 1
     print(count)
    
    # 练习:通过列表推导式获取字典所有的值
    stu = {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'}
    # ['程明明', 27, 89, '18860901744', '男']
    stu1 = [stu[x] for x in stu]
    print(stu1)
    
  2. 增 改

    字典[键] = 值 – 当键不存在的时候就是添加键值对,当键存在的时候就是修改键对应的值

    dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2}
    print(dog)
    
    # 添加
    dog['weight'] = 24
    print(dog)
    
    #  修改
    dog['name'] = '财财'
    print(dog)
    
  3.  # 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}
    del_val =dog.pop('gender')
    print(dog) #{'name': '旺财', 'breed': '土狗', 'age': 2}
    print(dog,del_val) #{'name': '旺财', 'breed': '土狗', 'age': 2} 母狗
    
    # 练习:写程序交换字典的键和值
    # {'a': 'b', 'c': 'd', 'e': 'f'}  -> {'b': 'a', 'd': 'c', 'f': 'e'}
    s = {'a': 'b', 'c': 'd', 'e': 'f'}
    b = {}
    for x in s:
        b[s[x]] = x
    
    print(b)
    
    # zid字典推导式:{键:值 for 变量 in 序列}
    dict2 = {s[x]:x for x in s}
    print(dict2)
    
    # 练习:使用推导式产生一个字典:
    # {2:4, 3:6, 4:8, 5:10}
    # {2:22, 3:33, 4:44, 5:55}
    a = range(2,6)
    list2 = {x: 2 * x for x in a}
    print(list2)
    
    list3 = {x: 10 * 11 for x in range(2,6)}
    print(list3)
    dict
    

字典相关操作和方法

  1. 运算符

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

      print([1,34,5,6] > [12,4])  # False ,比较相同位置上的值大小
      # print({'a':12}>{'a':34}) TypeError: '>' not supported between instances of 'dict' and 'dict'
      # print({'a':12}+{'a':34})  TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
      
  2. in 和 not in

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

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

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

    print(len(cat))  # 2
    # dict(数据) -- 将指定数据转换成字典
    #         数据的要求:a.数据本身是一个序列
    #         b.序列中de元素必须有且只有两个元素的小序列
    #         c.小序列中的元素必须是不可变的数据
    sep = [(1,34),'sd']
    result = dict(sep)
    print(result) #{1: 34, 's': 'd'}
    
    result = dict((x,x*2) for x in range(3))
    print(result)
    
    #  字典转序列
    
    cat = {'name':'咖啡','color':'白色'}
    print(list(cat)) #['name', 'color']
    
  4. 字典相关方法

    #  1) 字典.clear()
    cat.clear()
    print(cat)
    
    # 2)字典.copy()
    cat = {'name':'咖啡','color':'白色'}
    # cat2 = cat.copy(cat)
    
    # 3)keys , values, items
    # 字典.key() -获取字典所有的键,返回的值是序列
    # 字典.values() - 获取字典所有的zh值,返回的值是序列
    # 字典.items()- 将字典转换成元素是元组的序列(一个键值对对应一个元组)
    
    cat = {'name':'咖啡','color':'白色'}
    print(cat.keys()) #dict_keys(['name', 'color'])
    print(cat.values()) #dict_values(['咖啡', '白色'])
    print(cat.items()) #dict_items([('name', '咖啡'), ('color', '白色')])
    
    for x,y in cat.items():
        print(x,y)  # 不建议用 要遍历两次  用for
    
    # 4)字典.setdefault(键,值) - 添加键值对 (存添加,键在的时候i不会改原数据)
    cat = {'name':'咖啡','color':'白色'}
    cat.setdefault('weight',23)
    print(cat) #{'name': '咖啡', 'color': '白色', 'weight': 23}
    cat.setdefault('color','黑色')
    print(cat) #{'name': '咖啡', 'color': '白色', 'weight': 23}
    
    # 5) 字典.uppdate(序列) -- 将序列中的元素添加到字典中(序列必须是可以转换成字典的序列)
    # 字典1.update(字典2) --将字典2中所有的键值对添加到字典1中
    # 没有就会添加  ,有的 就会修改
    cat = {'name':'咖啡','color':'白色'}
    cat.update([(1,2),'as'])
    print(cat) #{'name': '咖啡', 'color': '白色', 1: 2, 'a': 's'}
    
    cat = {'name':'咖啡','color':'白色'}
    cat.update({'color':'heise'})
    print(cat) #{'name': '咖啡', 'color': 'heise'}
    

集合

  1. 什么是集合(set)

    '''
    集合是容器型数据类型(序列),将{} 作为容器标志,里面多个元素用逗号隔开:
    {元素1 , 元素2,}
    集合是可变的(支持增删改):无序的(不支持下标操作)
    集合的元素:必须是不可变的数据;唯一的
    
    '''
    #1) 空集合
    set1 = set()
    print(set1,type(set1),len(set1)) #set() <class 'set'> 0
    # 2) 集合无序
    print({1,23,4} == {4,23,1}) #True
    #3) 集合的元素是不可变的数据
    print({12,'24',(1,3)})
    # print({12,'24',[1,3]}) # 报错
    
    # 4) 集合元素是唯一的
    print({12,34,43,23,23,34,12}) #{34, 43, 12, 23}
    
    names = [12,34,43,23,23,34,12]
    print(set(names)) #{34, 43, 12, 23}
    
  2. 集合的增删改查 改(删掉原来的再加进去没办法直接改)

    • 没有下标信息 没法查单个
    # 1) 查 - 只有遍历
    nums = {12,34,43,2,23,4,1}
    print(list(nums))
    for x in nums:
        print(x,end=' ')
    
    # 2) 增
    # 集合.add(元素) -- 在集合中添加指定元素
    # 集合.update(序列) -- 将序列中所有的元素都添加到集合中
    nums.add(100)
    print(nums)
    nums.update('asd')
    print(nums) #{1, 2, 34, 4, 100, 's', 43, 12, 'd', 'a', 23}
    
    nums.update({'asd':12,'你':23})
    print(nums)
    
    # 3) 删
    # 集合.remove(元素) - 删除指定元素  元素不存在报错
    # 集合.discard(元素) - 删除指定元素  元素不存在不报错
    nums = {12,34,43,2,23,4,1}
    nums.remove(12)
    print(nums)
    nums.discard(34)
    print(nums)
    nums.remove(100)
    print(nums)
    nums.discard(100)
    print(nums)
    

数字数据

数学集合运算:& (交集) | (并集) -(差集) ^(对称差集)> \ < (判断是否是真子集) >= \ <= (判断是否是子集)


set1 = {1,2,3,4,5,6}
set2 = {1,6,4,5,8,9}
#  1. 集合1 & 集合2 _ 交集(获取两个集合公告部分)
print(set1 & set2) #{1, 4, 5, 6}
#  2. 集合1 | 集合2 - 并集(将两个集合合并产生一个新的集合)
print(set1 | set2) #{1, 2, 3, 4, 5, 6, 8, 9}
# 3.集合1- 集合2 - 差集(获取集合1中除了包含在集合2中以外的元素)
print(set1 - set2) # {2, 3}
print(set2 - set1) #{8, 9}
#  4.集合1^集合2 - 对称差集(集合1和集合2 合并然后去掉公共部分)
print(set1 ^ set2) #{2, 3, 8, 9}
#  5.子集
# 集合1 > 集合2 -判断集合2是否是集合1 的真子集
print({13,23,34,5} > {1,34})  #False
print({13,23,34,5} > {13,34}) #True  真子集:除了包含元素 还有其它元素
print({12, 34}> {12, 34}) #False
print({12, 34}>= {12, 34}) #True  子集

作业

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

    1. 统计不及格学生的个数

    2. 打印不及格学生的名字和对应的成绩

    3. 统计未成年学生的个数

    4. 打印手机尾号是8的学生的名字

    5. 打印最高分和对应的学生的名字

    6. 删除性别不明的所有学生

    7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

      students = [
      {'姓名':'王大','年龄': 23,'成绩': 67,'电话':15736515673,'性别':'男'},
      {'姓名':'李二','年龄': 24,'成绩': 87,'电话':15736515683,'性别':'男'},
      {'姓名':'李芳芳','年龄': 25,'成绩': 97,'电话':15736515673,'性别':'女'},
      {'姓名':'天天','年龄': 26,'成绩': 87,'电话':15336515678,'性别':'女'},
      {'姓名':'王二','年龄': 23,'成绩': 55,'电话':15936515673,'性别':'男'},
      {'姓名':'明明','年龄': 26,'成绩': 73,'电话':15735515678,'性别':'不明'}
      ]
       # 1. 统计不及格学生的个数
      
      list1 = [ x for x in students if x['成绩'] < 60 ]
      print(len(list1))
      
      count = 0
      for x in students:
          if x['成绩'] < 60:
              count += 1
      print('不及格个数:',count)
      
      # 2. 打印不及格学生的名字和对应的成绩
      for x in students:
          if x['成绩'] < 60:
              print('姓名:',x['姓名'],'成绩:',x['成绩'])
      
      # 3. 统计未成年学生的个数
      list1 = [ x for x in students if x['年龄'] < 18 ]
      print(len(list1))
      
      # 4. 打印手机尾号是8的学生的名字
      list1 = [ x['姓名'] for x in students if x['电话'] % 10 == 8 ]
      print(len(list1))
      
      
      # 5. 打印最高分和对应的学生的名字
      max1 = students[0]['成绩']
      for x in students:
          if x['成绩'] > max1:
              max1 = x['成绩']
      print(max1)
      stu = [x for x in students if x['成绩'] == max1]
      print(stu)
      for st in stu:
          print(st)
          print(st['姓名'], st['成绩'])
      
      # 6. 删除性别不明的所有学生
      list2 = []
      [list2.append(x) for x in students if x['性别'] != '不明']
      print(list2)
      
      # 7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
      list2 = [x['成绩'] for x in students]
      print(list2)
      list2.sort(reverse=True)
      print(list2)
      list3 = []
      for y in list2:
          for x in students:
              if y == x['成绩']:
                  list3.append(x)
      print(list3)
      
      
      
      
  2. 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)

    1. 求选课学生总共有多少人

    2. 求只选了第一个学科的人的数量和对应的名字

    3. 求只选了一门学科的学生的数量和对应的名字

    4. 求只选了两门学科的学生的数量和对应的名字

    5. 求选了三门学生的学生的数量和对应的名字

      python = {'stu1', 'stu2', 'stu3', 'stu6', 'stu7', 'stu10', 'stu11'}
      h5 = {'stu1', 'stu3', 'stu5', 'stu7', 'stu8', 'stu10'}
      jav = {'stu1', 'stu2', 'stu5', 'stu6', 'stu8', 'stu9', 'stu12'}
      # 1. 求选课学生总共有多少人
      set1 = python | h5 | jav
      print('总人数',len(set1))
      # 2. 求只选了第一个学科的人的数量和对应的名字
      set2 = python - (python & h5) - (python & jav)
      print('只选了第一个学科的人数:',len(set2),set2)
      
      # 3. 求只选了一门学科的学生的数量和对应的名字
      set3 = python ^ h5 ^ jav
      print('只选了一门学科的学生人数',len(set3),set3)
      # 4. 求只选了两门学科的学生的数量和对应的名字
      set5 = python & h5 & jav
      set4 = set1 - set2 -set5
      print('只选了二门学科的学生人数',len(set4),set4)
      # 5. 求选了三门学生的学生的数量和对应的名字
      set5 = python & h5 & jav
      print('选了三门学科的学生人数',len(set5),set5)
      
上一篇:记录内网渗透学习进程--DAY7


下一篇:K8s-day7-Ingress 介绍+重定向语法案例