2.23-字典

字典

字典:容器型数据类型 - 方便保存各种不同类型的数据
1.认识字典(dict):
1)将{}作为容器标志,里面多个键值对用逗号隔开,字典中元素只能是键值对
    键值对的格式:键:值,
    空字典:{}
    
2)字典的特性:可变性;无序性

3)元素的要求:
    键:必须是不可变的唯一的数据(数字、字符串、元组、布尔等)
    值:没有要求
字典和列表的选择:

需要同时保存多个数据的时候,如果多个数据的意义相同(无需区分),就使用列表;
如果多个数据的意义不同,就使用字典

2.字典的基本操作:
1.查 - 获取字典的值()

1)查单个(重要) - 获取一个值

语法1:字典[键]  -  获取字典中指定键对应的值
语法2:字典.get(键,默认值)
dog={'name':'旺财','age':'3',"breed":'土狗',"color";'白色'}
print(dog['age'])
print(dog['name'])
print(dog['high'])  #获取不存在键时,会报错
print(dog.get('breed'))
print(dog.get('color'))
print(dog.get('high'))  #获取不存在键时,不报错,返回None
print(dog.get('high',5))    #获取不存在时,不报错,返回默认值5

2)遍历

a,直接遍历
    for 变量 in 字典:
        pass
stu = {'name':'萨拉及','gender':'男','age':18,'score':100}
for x in stu:
    print(x,stu[x])
b.键值遍历
    for 键,值 in 字典.items():
        pass
3.字典的增删改操作
1.增/改 - 添加/修改键值对
1)字典[键] = 值   如果键存在就修改指定键对应的值;如果键不存在就添加键值对
cat = {'name':'花花','breed':'加菲','color':'白色'}
print(cat)

#加
cat['age']=2
print(cat)

#改
cat['name']='小白'
print(cat)
2)字典.setdefault(键,值) - 添加键值对    如果键存在,就不修改;如果键不存在,就添加键值对
2.删 - 删除键值对
del 字典[键]  -  删除指定键对应的键值对
字典.pop(键)  -  取出指定键对应的值
cat={'name': '花花','breed': '加菲','color': '白色'}
del cat['breed']
print(cat['name'])

result=cat.pop('color')
print(cat,result)
4.字典相关操作
1)字典只支持:==、!=,  不支持:+、*、>、<、>=、<=
2)in 和 not in  -  字典的in和not in 操作判断的是字典中是否存在指定的键
    键 in 字典
dict1={'a':10,'b':20,'c':30}
print(10 in dict1)    #False
print('a' in dict1)   #True
3)相关函数:len、dict
len(字典) - 获取字典中键值对的个数
dict(数据) -  将指定数据转换成字典
  对数据的要求:
  1.数据本身是一个序列
  2.序列中的元素必须都是有且只有两个元素的小序列,并且其中第一个元素是不可变的数据
seq=['ab','cd','ef']
print(dict(seq))

seq=[(10,20),range(2),'he']
print(dict(seq))
4)相关方法
a.字典.clear()
b.字典.copy()
c.返回一个序列
    字典.keys() - 返回一个序列,元素是字典中的所有键
    字典.value()    -   返回一个序列,元素是字典中的所有值
    字典.items()    -   返回一个序列,元素是键值对组成的元组
d.update
字典.update(序列)   -   将序列中的元素全部添加到字典中(序列必须是可以转换成字典的序列)
字典1.update(字典2)     -   将字典2中的所有键值对都添加到字典1中

5.字典推导式
{表达式1:表达式2 for 变量 in 序列}

2.23-字典练习

  1. 定义一个变量保存一个学生的信息,学生信息中包括:姓名、年龄、成绩(单科)、电话、性别

    student = {'姓名':'诡' , '年龄':18 , '成绩':99 ,'电话':'1008611' ,'性别':'男'}
    
  2. 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )

    students=[
        {'姓名':'诡神' , '年龄':18 , '成绩':99 ,'电话':'1008611' ,'性别':'男'},
        {'姓名':'时空' , '年龄':36 , '成绩':70 ,'电话':'1000008' ,'性别':'男'},
        {'姓名':'时刻' , '年龄':16 , '成绩':90 ,'电话':'1003563' ,'性别':'女'},
        {'姓名':'如风' , '年龄':28 , '成绩':80 ,'电话':'1008341' ,'性别':'男'},
        {'姓名':'楼主' , '年龄':32 , '成绩':59 ,'电话':'1004638' ,'性别':'不明'},
        {'姓名':'哀悼' , '年龄':30 , '成绩':66 ,'电话':'1002121' ,'性别':'男'}
    ]
    
    1. 统计不及格学生的个数

      方法1
      num=0
      for x in students:
          if x['成绩']<60:
              num+=1
      print(num)
      
      方法2
      num=len([x['成绩'] for x in students if x['成绩']<60])
      print(num)
      
    2. 打印不及格未成年学生的名字和对应的成绩

      dict1 = {stu['姓名']:stu['成绩'] for stu in students if stu['成绩']<60 }
      print(dict1)
      
    3. 求所有男生的平均年龄

      ages=[stu['年龄'] for stu in students if stu['性别']=='男']
      print(sum(ages)//len(ages))
      
    4. 打印手机尾号是8的学生的名字

      方法1
      names=[stu['姓名'] for stu in students if list(stu['电话'])[-1]=='8']
      print(names)
      
      方法2
      for stu in students:
          if list(stu['电话'])[-1]=='8':
              print(stu['姓名'])
      
    5. 打印最高分和对应的学生的名字

      max=students[0]['成绩']
      MAX=[{students[0]['成绩']:students[0]['姓名']}]
      for stu in students[1:]:
          if stu['成绩']>max:
              max=stu['成绩']
              MAX.clear()
              MAX.append({stu['成绩']:stu['姓名']})
          elif stu['成绩']==max:
              MAX.append({stu['成绩']:stu['姓名']})
      print(MAX)
      
    6. 删除性别不明的所有学生

      students2=students.copy()
      x=0
      for i,stu in enumerate(students):
          if stu['性别']=='不明':
              del students2[i-x]
              x+=1
      print(students2)
      
    7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

      max=0
      new=[]
      num=0
      for i in range(len(students)):
          for num1,stu in enumerate(students):
              if stu['成绩']>=max:
                  max=stu['成绩']
                  num=num1
              if num1==len(students)-1:
                  new.append(students[num])
                  students.remove(students[num])
                  max=0
      print(new)
      
  3. 定义一个变量保存一个班级的信息,班级信息中包括:班级名称、教室位置、班主任信息、讲师信息、班级所有的学生(根据实际情况确定数据类型和具体信息)

    class1 = {
        'name': '1班',
        'address': '311教室',
        'lecturer': {
            'name': 'A',
            'gender': '男',
            'age': 20,
            'tel': '1008611'
        },
        'class_teacher': {
            'name': 'S',
            'gender': '女',
            'tel': '1000000',
            'age': 30,
        },
        'students': [
            {'name': 'a', 'gender': '男', 'age': 11, 'score': 92, 'linkman': {'name': '老吴', 'tel': '110'}},
            {'name': 'b', 'gender': '女', 'age': 12, 'score': 90, 'linkman': {'name': '老张', 'tel': '120'}},
            {'name': 'c', 'gender': '男', 'age': 12, 'score': 87, 'linkman': {'name': '老赵', 'tel': '130'}},
            {'name': 'd', 'gender': '女', 'age': 13, 'score': 80, 'linkman': {'name': '老刘', 'tel': '140'}},
            {'name': 'e', 'gender': '男', 'age': 11, 'score': 95, 'linkman': {'name': '老徐', 'tel': '150'}},
            {'name': 'f', 'gender': '女', 'age': 11, 'score': 94, 'linkman': {'name': '老胡', 'tel': '160'}},
            {'name': 'g', 'gender': '男', 'age': 12, 'score': 85, 'linkman': {'name': '老王', 'tel': '170'}}
        ]
    }
    
    
  4. 已知一个列表保存了多个狗对应的字典:

    dogs = [
      {'name': '贝贝', 'color': '白色', 'breed': '银狐', 'age': 3, 'gender': '母'},
      {'name': '花花', 'color': '灰色', 'breed': '法斗', 'age': 2},
      {'name': '财财', 'color': '黑色', 'breed': '土狗', 'age': 5, 'gender': '公'},
      {'name': '包子', 'color': '黄色', 'breed': '哈士奇', 'age': 1},
      {'name': '可乐', 'color': '白色', 'breed': '银狐', 'age': 2},
      {'name': '旺财', 'color': '黄色', 'breed': '土狗', 'age': 2, 'gender': '母'}
    ]
    
    1. 利用列表推导式获取所有狗的品种

      [‘银狐’, ‘法斗’, ‘土狗’, ‘哈士奇’, ‘银狐’, ‘土狗’]

      breeds=[d['breed'] for d in dogs]
      print(breeds)
      
    2. 利用列表推导式获取所有白色狗的名字

      [‘贝贝’, ‘可乐’]

      names=[d['name'] for d in dogs if d['color']=='白色']
      print(names)
      
    3. 给dogs中没有性别的狗添加性别为 ‘公’

      for d in dogs:
          d.setdefault('gender','公')
      print(dogs)
      
    4. 统计 ‘银狐’ 的数量

      num=0
      for d in dogs:
          if d['breed']=='银狐':
              num+=1
      print(num)
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值