day7-字典和集合

01字典

  • 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
      
      1. 键是不可变的
      print({10:20,'abc':100,(1,2):300})
      # print({10:20,'abc':100,[1,2]:300})  # TypeError: unhashable type: 'list'
      
      1. 键的唯一的
      print({10:20,'abc':30,10:20,'abc':300})  # {10: 20, 'abc': 300}  只保存最后的值一个
      

02字典的增删查改

1.查 - 获取值
dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
  • 1) 查单个:

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

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

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

      print(dog['name'])
      print(dog['age'])
      
      print(dog.get('breed'))
      
      # print(dog['height'])   # KeyError: 'height'
      print(dog.get('height'))   # None
      print(dog.get('height', 100))  # 40
      print(dog.get('breed', 20))   # 土狗
      
  • 2)遍历

    • for 变量 in 字典:
      循环体

    • 注意:变量取到的是字典的键

      dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
      for x in dog:
          print(x, dog[x])   # 键  值
      
      # 练习
      students = [
          {&#39;name&#39;: &#39;程明明&#39;, &#39;age&#39;: 27, &#39;score&#39;: 89, &#39;tel&#39;: &#39;18860901744&#39;, &#39;gender&#39;: &#39;男&#39;},
          {&#39;name&#39;: &#39;梅迁&#39;, &#39;age&#39;: 26, &#39;score&#39;: 93, &#39;tel&#39;: &#39;13567193428&#39;, &#39;gender&#39;: &#39;男&#39;},
          {&#39;name&#39;: &#39;张三&#39;, &#39;age&#39;: 18, &#39;score&#39;: 43, &#39;tel&#39;: &#39;15367423810&#39;, &#39;gender&#39;: &#39;女&#39;},
          {&#39;name&#39;: &#39;李四&#39;, &#39;age&#39;: 34, &#39;score&#39;: 65, &#39;tel&#39;: &#39;13799413758&#39;, &#39;gender&#39;: &#39;不明&#39;},
          {&#39;name&#39;: &#39;王麻子&#39;, &#39;age&#39;: 23, &#39;score&#39;: 76, &#39;tel&#39;: &#39;15533753219&#39;, &#39;gender&#39;: &#39;男&#39;},
          {&#39;name&#39;: &#39;李冰冰&#39;, &#39;age&#39;: 17, &#39;score&#39;: 99, &#39;tel&#39;: &#39;17742589773&#39;, &#39;gender&#39;: &#39;女&#39;}
      ]
      # 练习:统计未成年的人数
      
      count = 0
      for stu in students:
          if stu[&#39;age&#39;] &lt; 18:
              count += 1
      print(&#39;未成年人数&#39;,count)
      
      
      # 练习:通过列表推导式获取字典所有的值
      stu = {&#39;name&#39;: &#39;程明明&#39;, &#39;age&#39;: 27, &#39;score&#39;: 89, &#39;tel&#39;: &#39;18860901744&#39;, &#39;gender&#39;: &#39;男&#39;}
      # [&#39;程明明&#39;, 27, 89, &#39;18860901744&#39;, &#39;男&#39;]
      
      list1 = [stu[x] for x in stu]
      print(list1)#
      
2.增、改
  • 字典[键] = 值 - 当键不存在的时候添加键值对,当键存在的时候修改指定键对应的值

    dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
    print(dog)
    
    # 添加
    dog['weight'] = 10
    print(dog)
    
    # 修改
    dog['name'] = '旺财'
    print(dog)
    
3.删除
    1. del 字典[键] - 删除字典中指定键 对应的键值对
    dog = {'name': '财财', 'breed': '土狗', 'gender': '母狗', 'age': 2}
    del dog['breed']
    print(dog)  # {'name': '财财', 'gender': '母狗', 'age': 2}
    
    # del dog['height']    # KeyError: 'height'
    
  • 2)字典.pop(键) - 取出字典中指定键对应的值 是值

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


# 练习:使用推导式产生一个字典:
# {2:4, 3:6, 4:8, 5:10}
# {2:22, 3:33, 4:44, 5:55}
dict4 = {i: 2*i for i in range(2, 6)}
print(dict4)

dict5 = {i: 11*i for i in range(2, 6)}
print(dict5)

03字典相关操作和方法

  • 1.运算符

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

    print([1, 2, 3, 4, 5] > [10, 20])  # False 比较第一对不相等的元素的大小  1<10
    
    # print({'a':10} > {'a':20}) # TypeError: '>' not supported between instances of 'dict' and 'dict'
    
    # print({'a':10} + {'b':20})  #TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
    
  • 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)  # {0: 0, 1: 2, 2: 4}
    
    
    # 字典转列表
    cat = {'name':'咖啡','color':'白色','breed':'折耳'}
    print(list(cat))  # ['name', 'color', 'breed']  只有键
    
  • 4.字典相关方法

    • 1)字典.clear()

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

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

      # 字典.keys()  - 获取字典所有的键,返回序列
      print(cat.keys())  # dict_keys(['name', 'color', 'breed'])
      # 字典.values()  - 获取字典所有的值,返回序列
      print(cat.values())  # dict_values(['咖啡', '白色', '折耳'])
      # 字典.items()  - 将字典转换成元素是元组的序列(一个键对 对应一个元组)
      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}
      # 键存在的时候不会修改
      
      1. 字典.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}
      # 颜色会改变
      

04实际开发中的字典

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 x in cl['students']:
    print('紧急联系人电话', x['linkman']['tel'])

# 打印所有老师的名字
for x in cl['teachers']:
    print('所有老师的名字', x['name'])

# 给所有的紧急联系人添加性别,性别默认是男
for x in cl['students']:
    x['linkman'].setdefault('性别', '男')
print(cl['students'])

05 数字数据

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

True == 1 False == 0

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

    import math
    import cmath # 复数

    • 1)浮点数转换成整数

      # 1) int(浮点数) - 直接去掉小数点后面的数
      print(int(num))
      
      # 1) ceil函数
      print(math.ceil(1.99))  # 2
      print(math.ceil(1.29))  # 2
      print(math.ceil(2.001))  # 3
      
      print(math.ceil(-3.001))  # -3
      
      print(math.copysign(-4,-2))   # -4.0   前面提供绝对值,后面提供符号
      
    • 2) 绝对值

    # 绝对值  math.fabs()
    print(math.fabs(-32))   # 32.0  浮点型
    print(math.fabs(12))   # 12.0  浮点型
    # 绝对值  abs
    print(abs(-32))   # 32
    print(abs(-32.2))   # 32.2
    
    • 3)阶乘

      print(math.factorial(3))  # 阶乘
      
    • 4)math.floor(浮点数) - 向小取整

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

      print(round(2.999))   # 3
      print(round(2.4599))   # 2
      print(round(-3.001))   # -3
      print(round(-3.689))   # -4
      

06 集合

  • 1.什么是集合

    集合是容器型数据类型(序列),将{}作为容器标志,里面有多个元素用逗号隔开:{元素1,元素2…}
    集合是可变的(支持增删改);无序的(不支持下标操作)
    集合的元素:必须是不可变的数据;唯一的

    • 1)空集合

      set1 = {}   # 表示空字典
      set2 = set()
      print(set2, type(set2), len(set2))  # set() <class 'set'> 0
      
      1. 集合无序
      print({1, 2, 3} == {3, 2, 1})  # True
      
      1. 集合的元素是不可变的数据
      print({10, 'abc', (2,3)})
      # print({10, 'abc', [2,3]})  # 报错
      
    • 4) 集合元素是唯一的

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

    • 1) 查 - 只有遍历

      nums = {10,78,67,35,70,89}
      for x in nums:
          print(x)  # 顺序可能不一样  先转换成列表 ,再遍历列表
      
    • 2)增

      # 集合.add(元素)  -  在集合中添加指定元素
      nums.add(100)
      print(nums)
      
      # 集合.update(序列)  -  将序列中所有的元素添加到集合中
      nums.update('abc')  #  序列  -> 'a' 'b' 'c'
      print(nums)
      
      nums.update({'name':'张三','age':18})
      print(nums) # {35, 67, 100, 70, 'name', 'b', 'age', 10, 78, 'a', 89, 'c'}
      # 添加键
      
    • 3)删

      # 集合.remove(元素)  - 删除指定元素,元素不存在就报错
      # 集合.discard(元素)   - 删除指定元素,元素不存在不会报错
      nums = {10, 78, 67, 35, 70, 89}
      nums.remove(10)
      print(nums)  # {35, 67, 70, 78, 89}
      nums.discard(35)
      print(nums)  # {67, 70, 78, 89}
      
      # nums.remove(1000)  # KeyError: 1000
      nums.discard(1000)
      print(nums)  # {67, 70, 78, 89}  不会报错
      

07数学集合运算

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

  • 1.集合1 & 集合2 - 交集

    set2 = {1, 2, 3} & {1, 2, 4, 5}
    print(set2)  # {1, 2}
    
  • 2.集合1 | 集合2 - 并集

    set1 = {1, 2, 3} | {4, 5}
    print(set1)  # {1, 2, 3, 4, 5}
    
  • 3.集合1 - 集合2 - 差集 (获取集合1中除了包含在集合2中的元素)

    set3 = {1, 2, 3, 4, 5} - {4, 5, 6, 7}
    print(set3)  # {1, 2, 3}
    set3 = {4, 5, 6, 7} - {1, 2, 3, 4, 5}
    print(set3)  # {6, 7}
    
  • 4.集合1 ^ 集合2 - 对称差集 (集合1,2合并去掉公共部分)

    set4 = {1, 2, 3, 4, 5} ^ {4, 5, 6, 7}
    print(set4)  # {1, 2, 3, 6, 7}
    
  • 5.集合1 > 集合2 - 判断集合2是否是集合1的真子集

  • 集合1 >= 集合2 - 判断集合2是否是集合1的子集

    set5 = {1, 2, 3, 4, 5} > {4, 5, 6, 7}
    print(set5)   # False
    set5 = {4, 5} < {4, 5, 6, 7}
    print(set5)   # True  真子集
    set5 = {1, 2, 3, 4, 5} > {1,2}
    print(set5)   # True
    
    print({10, 20} > {10, 20})  # False
    print({10, 20} >= {10, 20})   # True
    

作业

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

    1. 统计不及格学生的个数
    2. 打印不及格学生的名字和对应的成绩
    3. 统计未成年学生的个数
    4. 打印手机尾号是8的学生的名字
    5. 打印最高分和对应的学生的名字
    6. 删除性别不明的所有学生
    7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
    students=[
        {'name':'小明','age':30,'score':89,'tel':'566245','性别':'女'},
        {'name':'小红','age':25,'score':90,'tel':'566245','性别':'男'},
        {'name':'小张','age':20,'score':50,'tel':'566245','性别':'女'},
        {'name':'小赵','age':17,'score':63,'tel':'566245','性别':'未知'},
        {'name':'小李','age':18,'score':70,'tel':'566245','性别':'男'},
        {'name':'小吴','age':19,'score':90,'tel':'566245','性别':'女'},
    ]
    
    
    #a.统计不及格学生的个数
    count =0
    for x in students:
        if x['score'] < 60:
            count +=1
    print(count)
    # 1
    
    
    # b.打印不及格学生的名字和对应的成绩
    for x in students:
        if x['score'] < 60:
            print(x['name'],x['score'])
    # 小张 50
    
    
    # c.统计未成年学生的个数
    count1=0
    for x in students:
        if x['age'] < 18:
            count1 += 1
    print(count1)
    #1
    
    
    # d.打印手机尾号是8的学生的名字
    for x in students:
        if int(x['tel']) % 10 == 8:
            print('手机尾号是8的学生的名字',x['name'])
    # 手机尾号是8的学生的名字 小张
    # 手机尾号是8的学生的名字 小赵
    # 手机尾号是8的学生的名字 小吴 
    
    
    
    
    # e.打印最高分和对应的学生的名字
    max1 =0
    for x in students:
        if x['score'] >= max1:
            max1 = x['score']
    
    for x in students:
        if x['score'] == max1:
            print('最高分和对应的学生的名字',x['name'] )
    
    # 最高分和对应的学生的名字 小红
    # 最高分和对应的学生的名字 小吴
    
    
    # f.删除性别不明的所有学生
    new_students = []
    for x in students:
        if x['性别'] != '未知':
            new_students.append(x)
    
    print(new_students)
    # [{'name': '小明', 'age': 30, 'score': 89, 'tel': '566245', '性别': '女'}, {'name': '小红', 'age': 25, 'score': 90, 'tel': '566245', '性别': '男'}, {'name': '小张', 'age': 20, 'score': 50, 'tel': '566278', '性别': '女'}, {'name': '小李', 'age': 18, 'score': 70, 'tel': '566245', '性别': '男'}, {'name': '小吴', 'age': 19, 'score': 90, 'tel': '566288', '性别': '女'}]
    
    
    
    # g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
    new_students2 = []
    for x in students:
        new_students2.append(x['score'])
    
    #print(new_students2)
    new_students2.sort(reverse=True)
    print(new_students2)
    # [90, 90, 80, 70, 63, 50]
    
  2. 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)

    1. 求选课学生总共有多少人
    2. 求只选了第一个学科的人的数量和对应的名字
    3. 求只选了一门学科的学生的数量和对应的名字
    4. 求只选了两门学科的学生的数量和对应的名字
    5. 求选了三门学生的学生的数量和对应的名字
class1 ={'张一', '李二', '王四', '李一', '张四', '赵六'}
class2 ={'张二', '李二', '王四', '李一', '张四', '赵一'}
class3 ={'张三', '李二', '王三', '李一', '张四', '赵六'}

#  1. 求选课学生总共有多少人
set1 = class1 | class2 | class3
print(set1)
# {'王三', '李二', '李一', '赵六', '张四', '王四', '张一', '赵一', '张三', '张二'}


#  2. 求只选了第一个学科的人的数量和对应的名字
print(len(class1), class1)
# 6 {'李二', '李一', '赵六', '张四', '王四', '张一'}



# 3. 求只选了一门学科的学生的数量和对应的名字
set1 = class1 | class2 | class3
set2 = set1 - (class1 & class2)-(class2 & class3)-(class1 & class3)
print(set2)
#{'王三', '张三', '张一', '赵一', '张二'}


# 4. 求只选了两门学科的学生的数量和对应的名字
set1 = class1 | class2 | class3
set3 = set1 - (class1 & class2 & class3)
print(len(set3),set3)
# 7 {'王三', '赵六', '王四', '张一', '赵一', '张三', '张二'}


# 5. 求选了三门学生的学生的数量和对应的名字
set4 = class1 & class2 & class3
print(len(set4),set4)
#3 {'张四', '李二', '李一'}
学生信息管理系统

dict1 ={}
flag0 = 1

names_list = []
age_list = []
tel_list = []

new_list = []
index = 0
while flag0:
    print('=======================')
    print('欢迎光临!')
    print('    1.添加学生')
    print('    2.查看学生')
    print('    3.修改学生信息')
    print('    4.删除学生')
    print('    5.返回')
    print('=======================')
    flag = int(input('请输入(1-5):'))
    while True:
        if flag == 1:
            names_list.append(input('请输入学生姓名:'))
            age_list.append(input('请输入学生年龄:'))
            tel_list.append(input('请输入学生电话:'))
            # dict1.setdefault('age', input('请输入学生:'))
            # dict1.setdefault('tel', input('请输入学生电话:'))
            if names_list:
                print('添加成功!')
                # print(dict1)
                print('1.继续')
                print('2.返回')
                flag1 = int(input('请输入(1-2):'))
                if flag1 == 1:
                    continue
                else:
                    break
        elif flag == 2:
            print('1.查看所有学生')
            print('2.按姓名查找')
            print('3.按学号查找')
            print('4.返回')
            flag2 = int(input('请输入(1-4):'))
            for i in range(len(names_list)):
                dict1['name'] = names_list[i]
                dict1['age'] = age_list[i]
                dict1['tel'] = tel_list[i]
                new_list.append(dict1.copy())
            if flag2 == 1:
                print(new_list)
            elif flag2 == 2:
                new_name = input('请输入所要查找的姓名:')
                for x in new_list:
                    if new_name == x['name']:
                        print(x)
                        break
            elif flag2 == 3:
                continue
            elif flag2 == 4:
                break
        elif flag == 3:
            break
        elif flag == 4:
            break
        else:
            flag0 = 0
            break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值