day7- 字典和元组

本文详细介绍了Python中的元组和字典,元组是不可变的序列,类似列表但不支持修改,而字典是可变的键值对集合。文章讨论了元组的创建、访问、操作及字典的定义、增删改查等特性,并举例说明了字典方法的使用,如clear、copy、keys、values、items和update等。同时,提供了课后作业,涉及学生信息管理、数据统计和列表推导式等实际应用。
摘要由CSDN通过智能技术生成

字典和元组

1.什么是元组

元组是容器型数据类型(序列),将()作为容器的标志,里面多个元素用逗号隔开:(元素1,元素2,元素3,…)

元组不可变(不支持增删改);元组是有序的(支持下标操作)

元素:任何类型的数据

空元组

t1 = ()
print(t1, type(t1))

t2 = (12, 3, 45)
print(t2)

1.2)元组就是不可变的列表

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

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

for index in range(len(t3)):
    print(index, t3[index])

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
print(10 in t1)      #  True

3)相关函数

max、min、sum、sorted、len、tuple

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

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

a = [10, 20, 30]
b = [10, 20, 30]
print(id(a), id(b))    # 内存地址不相同

a = (10, 20, 30)
b = (10, 20, 30)
print(id(a), id(b))   # 内存地址相同

2.元组不只是不可变的列表

2.1)只有一个元素的元组:(元素,)

list1 = [10]
print(list)

t1 = (10,)
print(t1, type(t1))

2.2)元组的()在没有歧义的情况下可以省略

t1 = 10, 20, 30
print(t1, type(t1))   # (10, 20, 30) <class 'tuple'>

t2= 10, 20, 30 * 2
print(t2)

2.3)使用多个变量直接获取元素(元组和列表都支持)

t1 = (100, 200, 300)
x, y, z = t1
print(x, y, z)  # 100 200 300

pos = (200, 45)
x, y = pos
print(x, y)

让变量的个数小于元组中元素的个数,这个时候必须在某一个变量前加*

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

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]

m, *n, t = t1
print(m, t, n)    # 小明 56 ['男', 18, 170, 90, 87]

3.什么是字典

3.1)字典是容器型数据类型(序列),将{}作为容器的标志,里面多个键值对用逗号隔开(一个键值对就是字典的一个元素):{键1:值1,键2:值2,…}

3.2)字典是可变的(支持增删改);字典无序(不支持下标操作)

3.3)元素 —— 字典的元素必须是键值对

键 —— 必须是不可变的数据,一般用字符串

值 —— 任何类型的数据都可以作为字典的值

3.4)空字典

dict = {}

3.5字典无序

print({'a': 10, 'b': 20} == {'b': 20, 'a': 10})
print([10, 20] == [20, 10])  # False

3.6键必须是不可以变类型的数据

# dict1 = {10: 100, 'a': 200, [10] 300}   # 报错 列表不能作为键
# dict1 = {10: 100, 'a': 200, {'x': 300}}  # 报错 字典不能作为键
# print(dict1)

4.查 —— 获取值

4.1)查单个

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

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

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

student = {'name': '钟婷', 'age': 18, 'height': 155, 'weight': 51, '语文': 80, '数学': 95, '英语': 55 }
print(student['name'])
print(student['数学'])

print(student.get('name'))
print(student.get('数学'))

key = 'height'
print(student[key])

# print(student['gender'])   # 当键不存在时 报错 KeyError: 'height'
print(student.get('gender')) # 当键不存在,返回空值

list1 = [{'name': '小明', 'age': 20}, {'name': '小花', 'age': 16}]
print(list1[-1]['age'])

student = {'name': '钟婷', 'age': 18, 'height': 155, 'weight': 51, '语文': 80, '数学': 95, '英语': 55 }
print(student['语文'])
print(student.get('数学'))
print(student.get('物理', 70))

4.2)遍历

for 键 in 字典

​ 循环体

student = {'name': '钟婷', 'age': 18, 'height': 155, 'weight': 51, '语文': 80, '数学': 95, '英语': 55 }
for key in student:
    print(key, student[key])

4.3)增、改

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

字典.setdefault(键,值) —— 键不存在的时候添加键值对,存在的时候不作为

dog = {'name': '财财', 'age': 3, 'breed': '金毛'}
print(dog)
dog['gender'] = '母狗'
print(dog)  # {'name': '财财', 'age': 3, 'breed': '金毛', 'gender': '母狗'}

dog['name'] = '旺财'
print(dog)  # {'name': '旺财', 'age': 3, 'breed': '金毛', 'gender': '母狗'}


dogs = [
    {'name': '大黄','age': 3, 'breed': '金毛'},
    {'name': '狗1', 'age': 1, 'breed': '土狗'},
    {'name': '狗2', 'breed': '土狗'},
    {'name': '狗3', 'breed': '土狗'},
]

for dog in dogs:
    # dog['age'] = 0
    dog.setdefault('age', 0)

for dog in dogs:
    dog.setdefault('food', '狗粮')
print(dogs)

for dog in dogs:
    dog['name'] = '兜兜'
print(dogs)

4.4)删

del 字典[键] —— 删除指定键对应的键值对

字典.pop(键)—— 取出指定键对应的值

student = {'name': '钟婷', 'age': 18, 'height': 155, 'weight': 51, '语文': 80, '数学': 95, '英语': 55 }
del student['weight']
print(student) #  {'name': '钟婷', 'age': 18, 'height': 155, '语文': 80, '数学': 95, '英语': 55}

result = student.pop('height')
print(student, result)   # {'name': '钟婷', 'age': 18, '语文': 80, '数学': 95, '英语': 55} 155

del student['数学']
print(student)

student.pop('语文')
print(student)

5.相关操作

字典不支持+ 、* 、> 、< 、>=、<=,支持in和not in

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

d1 = {'a': 10, 'b': 20, 'c': 30}
print(10 in d1)     # False
print('b' in d1)    # True

6.相关函数

max、min、sum、sorted字典都支持,但是一般不用(操作对象都是键)。

len(字典)

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

​ a. 数据本身是一个序列

​ b.序列中的元素是有且只有两个元素的小序列

​ c.小序列中的第一个元素必须是不可变的数据

data1 = ['ab', (10, 20), ['name', '小明']]
result = dict(data1)
print(result)

补充:将字典转成成列表或者元组的时候,只对键进行取值

d1 = {'a': 10, 'b': 20, 'c': 30}
list1 = list(d1)
print(list1)        # ['a', 'b', 'c']

7.字典相关方法

7.1)字典.clear

7.2)字典.copy

7.3)字典.keys() —— 获取所有的键,返回一个序列

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

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

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)])
list1 = [10, 20, 45, 'abc']
for x in list1:
    print('x:', x)

list1 = [('a', 10), ('b', 20), ('c', 30)]
for x in list1:
    print('x:', x)

for x, y in list1:
    print(x, y)

for key, value in d1.items():
    print(key, value)

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

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

d1 = {'a': 10, 'b': 20}
d1.update({'c': 100, 'd': 200})
print(d1)       # {'a': 10, 'b': 20, 'c': 100, 'd': 200}

课后作业

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

    student = {'name': '小明', 'age': 20, '语文': 95, '数学': 85, '英语': 75, 'tel': '13707077548', 'gender': '男'}
    print(student)
    
    
  2. 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )

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

      students = [
          {'name': '小明', 'age': 16, 'score': 78, 'tel': '18349201362', 'gender': '男'},
          {'name': '小强', 'age': 19, 'score': 92, 'tel': '13888592208', 'gender': '男'},
          {'name': '小马', 'age': 17, 'score': 56, 'tel': '13540638245', 'gender': '男'},
          {'name': '小周', 'age': 21, 'score': 84, 'tel': '15923456968', 'gender': '女'},
          {'name': '小张', 'age': 20, 'score': 70, 'tel': '13982800614', 'gender': '女'},
          {'name': '小赵', 'age': 18, 'score': 65, 'tel': '16625572642', 'gender': '不明'}
      ]
      count = 0
      for x in students:
          if x['score'] < 60:
              count += 1
      print(count)
      
    2. 打印不及格未成年学生的名字和对应的成绩

      for x in students:
          if x['score'] < 60 and x['age'] < 18:
              print(x['name'], x['score'])
      
      
    3. 求所有男生的平均年龄

      count = 0
      ages = 0
      for x in students:
          if x['gender'] == '男':
              count += 1
              ages += x['age']
      print(ages / count)
      
    4. 打印手机尾号是8的学生的名字

      for x in students:
          if x['tel'][-1] == '8':
              print(x['name'])
      
    5. 打印最高分和对应的学生的名字

      scores = [x['score'] for x in students]
      max1 = max(scores)
      
      for x in students:
          if x['score'] == max1:
              print(max1, x['name'])
      
    6. 删除性别不明的所有学生

      for x in students:
          if x['gender'] == '不明':
              students.remove(x)
      print(students)
      
      
    7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

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

    class1 = [
        {'班级名称': 'Python2106'},
        {'教室位置': '18教室'},
        {'班主任信息': '朱老师'},
        {'讲师信息': '余婷'},
        {'学生姓名': '小明', 'age': 18, 'score': 95, 'gender': '男'},
        {'学生姓名': '小张', 'age': 20, 'score': 75, 'gender': '女'},
        {'学生姓名': '小刘', 'age': 16, 'score': 82, 'gender': '男'}
    
    ]
    print(class1)
    
  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. 利用列表推导式获取所有狗的品种

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

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

      [‘贝贝’, ‘可乐’]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值