day7-字典

# 字典和元组

元组

什么是元组:

元组是容器型数据类型(序列),将()作为容器的标志,里面多个元素用逗号隔开:(元素1, 元素2, 元素3,…)
元组不可变(不支持增删改);元组是有序的(支持下标操作)
元素: 任何类型的数据

  • 空元组
t1 = ()
print(t1, type(t1))

元组就是不可变的列表,列表中和可变无关的操作,元组都支持

1) 查
t3 = ('长津湖', '战狼', '我是特种兵', '阿凡达', '悬崖上的金鱼姬')
print(t3[-1], t3[0], t3[1])     # 悬崖上的金鱼姬 长津湖 战狼
print(t3[2:])       # ('我是特种兵', '阿凡达', '悬崖上的金鱼姬')

2)相关操作
t1 = (10, 20, 30)
t2 = (111, 222)
print(t1 + t2)      # (10, 20, 30, 111, 222)
print(t1 * 2)       # (10, 20, 30, 10, 20, 30)
print((10, 20, 30) == (20, 10, 30))     # False
print((100, 1, 1000) > (100, 2, -3003))     # False
3)相关函数

max、min、sum、sored、len、tuple

t1 = (34, 56, 89, 1, 90, 32)
print(max(t1), min(t1), sum(t1), len(t1))	#90 1 302 6
print(sorted(t1))       # [1, 32, 34, 56, 89, 90]
print(tuple('abc'))     # ('a', 'b', 'c')
4)相关方法

元组不支持拷贝 - 不可变数据在内存中存储的时候同一个数据只会存一份

b = (10, 20, 30)
print(id(a), id(b))		#2147008894208 2147008894208
元组不只是不可变的列表
1) 只有一个元素的元组: (元素,)
t1 = (10,)
print(t1, type(t1))
2)元组的()在没有歧义的情况下可以省略
t1 = 10, 20, 30
print(t1, type(t1))
3) 使用多个变量直接获取元素(元组和列表都支持)
  • 让变量的个数和元组元素的个数保持一致
t1 = (100, 200, 300)
x, y, z = t1
print(x, y, z)
  • 让变量的个数小于元组中元素的个数, 这个时候必须在某一个变量前加*
t1 = ('小明', '男', 18, 170, 90, 87, 56)
name, *x = t1
print(name, x)  # 小明 ['男', 18, 170, 90, 87, 56]

*a, b, c = t1
print(b, c, a)      # 87 56 ['小明', '男', 18, 170, 90]

获取元素的时候先让没有的变量按照位置获取相应的数据,然后再将剩下的数据全部给带的变量(变*的变量会变成一个列表)

认识字典

字典存在的意义

列表:保存的多个数据意义相同,例如:保存10个学生,10个姓名…

字典:保存多个意义不同的数据,例如:年龄、身高、体重 或者 语文、数学、英文的成绩…

什么是字典(dict)
  1. 字典是容器型数据类型(序列),将{}作为容器的标志,里面多个键值对用逗号(一个键值对就是字典的一个元素):{键1:值1, 键2:值2,…}
  2. 字典是可变的(支持增删改);字典无序(不支持下标操作)
  3. 元素 - 字典的元素必须是键值对
    键 - 必须是不可变的数据,一般用字符串
    值 - 任何类型的数据都可以作为字典的值
空字典
dict1 = {}
字典无序
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10})         # True
print([10, 20] == [20, 10])     # False
键必须是不可变类型的数据
dict1 = {10: 100, 'a': 200, (10,): 300}
print(dict1)

# dict1 = {10: 100, 'a': 200, [10]: 300}        # 报错! 列表不能作为键
# dict1 = {10: 100, 'a': 200, {'x': 2}: 300}    # 报错! 字典不能作为键
值可以是任何类型的数据
dict2 = {'a': 10, 'b': 23.4, 'c': 'abc', 'd': [10, 20, 30], 'e': {'x': 100}, 'f': lambda x: x*2}
print(dict2)

字典的增删改查

查 - 获取值
查单个

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

dict1 = {10: 100, 'a': 200, (10,): 300}
print(dict1[(10,)])
print(dict1.get('a'))
print(dict1.get('b', 20))
遍历

for 键 in 字典:
循环体

dict1 = {10: 100, 'a': 200, (10,): 300}
for key in dict1:
    print(key, dict1[key])
增、改
字典[键] = 值

当键不存在的时候就添加键值对;当键存在的时候就修改键对应的值

dog = {'name': '财财', 'age': 3, 'breed': '金毛'}
dog['name'] = '旺财'
print(dog)		#{'name': '旺财', 'age': 3, 'breed': '金毛'}
字典.setdefault(键, 值)

键不存在的时候添加键值对,存在的时候不作为

student = {'name': 'wk', '年龄': 21, '身高': 168, '体重': 50, '语文': 100, '数学': 20, '英语': 99}
student.setdefault('地理', 60)
print(student)
del 字典[键]

删除指定键对应的键值对

student = {'name': 'wk', '年龄': 21, '身高': 168, '体重': 50, '语文': 100, '数学': 20, '英语': 99}
del student['数学']
print(student)
字典.pop(键)

取出指定键对应的值,并且返回

student = {'name': 'wk', '年龄': 21, '身高': 168, '体重': 50, '语文': 100, '数学': 20, '英语': 99}
result = student.pop('语文')
print(student, result)

字典相关操作函数和方法

1. 相关操作

字典不支持+、*、>、<、>=、<=

支持in和not in

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

d1 = {'a': 10, 'b': 20, 'c': 30}
print(10 in d1)     # False
print('b' in d1)    # True
2. 相关函数
max、min、sum、sorted字典都支持,但是一般不用(操作对象都是键)。

len(字典)

dict(数据) - 将if指定数据转换成字典。数据必须满足以下要求:

  • 数据本身是一个序列
  • 序列中的元素是有且只有两个元素的小序列
  • 小序列中的第一个元素必须是不可变的数据
data1 = ['ab', (10, 20), ['name', '小明']]
result = dict(data1)
print(result)		#{'a': 'b', 10: 20, 'name': '小明'}
补充: 将字典转换成列表或者元组的时候
d1 = {'a': 10, 'b': 20, 'c': 30}
list1 = list(d1)
print(list1)        # ['a', 'b', 'c']
3. 字典相关方法
  • 字典.clear()

  • 字典.copy()

  • 字典.keys() - 获取所有的键, 返回一个序

  • 字典.values() - 获取所有的值, 返回一个序列

  • 字典.items() - 将字典的键值对转换成元组,以序列的形式返回

  • 字典.update(序列) - 将序列中的元素作为键值对添加到字典(序列必须是能够转换成字典的序列)

  • 字典1.update(字典2) - 将字典2中的键值对全部添加字典1中

d1 = {'a': 10, 'b': 20, 'c': 30}
print(d1.keys())        # dict_keys(['a', 'b', 'c'])
print(d1.values())      # dict_values([10, 20, 30])
print(d1.items())       # dict_items([('a', 10), ('b', 20), ('c', 30)])
for key, value in d1.items():
    print(key, value)
d1 = {'a': 10, 'b': 20}
d1.update({'c': 100, 'd': 200})
print(d1)       # {'a': 10, 'b': 20, 'c': 100, 'd': 200}
  1. 定义一个变量保存一个学生的信息,学生信心中包括:姓名、年龄、成绩(单科)、电话、性别

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

    students = [{'姓名': '李四', '年龄': 20, '成绩(单科)': 98, '电话': '1234567', '性别': '男'},
                {'姓名': '张三', '年龄': 21, '成绩(单科)': 60, '电话': '11223344', '性别': '女'},
                {'姓名': '王五', '年龄': 18, '成绩(单科)': 89, '电话': '19389040', '性别': '女'},
                {'姓名': '小明', '年龄': 22, '成绩(单科)': 54, '电话': '14764985', '性别': '不明'},
                {'姓名': '小红', '年龄': 19, '成绩(单科)': 72, '电话': '13425655', '性别': '不明'},
                {'姓名': '小敏', '年龄': 15, '成绩(单科)': 35, '电话': '14674758', '性别': '男'}
    ]
    
    1. 统计不及格学生的个数

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

      for dict1 in students:
          if dict1['成绩’] < 60 and dict1['年龄'] < 18:
              print(dict1['姓名'], dict1['成绩'])
      
    3. 求所有男生的平均年龄

      age_sum = 0
      count = 0
      for dict1 in students:
          if dict1['性别'] == '男':
              count += 1
              age_sum += dict1['年龄']
      print(age_sum / count)
      
    4. 打印手机尾号是8的学生的名字

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

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

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

  3. 定义一个变量保存一个班级的信息,班级信息中包括:班级名称、教室位置、班主任信息、讲师信息、班级所有的学生(根据实际情况确定数据类型和具体信息)

    class1 = [{'班级名称':2106, '教室位置':12},
              {'班主任':'朱老师','年龄':27, '性别':'女'},
              {'讲师':'余老师', '年龄':18, '性别':'女'},
              {'学生':'甲','年龄':21, '性别':'男'},
              {'学生':'乙','年龄':26, '性别':'男'},
              {'学生':'丙','年龄':21, '性别':'女'}
    ]
    
  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. 利用列表推导式获取所有狗的品种

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

for x in dogs:
   print(x['breed'], end=' ')
  1. 利用列表推导式获取所有白色狗的名字

    [‘贝贝’, ‘可乐’]

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

    [x.setdefault('gender', '公') for x in dogs]
    print(dogs)
    
  2. 统计 ‘银狐’ 的数量

    count = 0
    for x in dogs:
        if x['breed'] == '银狐':
            count += 1
    print(count)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值