week02day02(字典、元组)

发布时间:2024年01月23日

一. 字典

?1. 字典的作用:

  • 场景:定义一个变量保存一个学生的信息
stu = ['小明', '男', 170, 60, 80, 22, 66, 30]

?用列表的话,数据意义不明。

### 字典写法会更加清晰

student = {'name':'小明', 'gender':'男','height':170, 'weight':60, '数学':80, '语文':22, '英语':66, 'age': 30}
print(student['name'])

2. 列表和字典的选择:

  • 列表和字典都可以保存多个数据,如果需要保存多个数据的意义不同就使用字典
  • 如果同时保存的多个数据的意义相同就用列表

3. 字典的定义

  • 字典是容器型数据类型;将{ }作为容器的标志,里面多个键值对用逗号隔开:

? ? ? ?{键1:值1,键2:值2,键3:值3, .....}

  • 字典是可变的(支持增删改),字典是无序的(顺序不影响结果,不支持索引操作)
  • 字典对元素的要求
  1. ? 字典中的元素必须全部是键值对,键值对必须成对出现
  2. ? 键的要求: 键必须是不可变类型数据,一般为字符串。 键是唯一的
  3. ? 值的要求: 没有要求
dict1 = {}  #空字典

print({'a':10, 'b':20} == {'b':20, 'a':10})  #字典是无序的 True

#键必须是不可变类型的数据
dict2 = {10:1 , 'a':2 , True:3 }

#键是唯一的
dict3 = {'a':10 , 'a':20 , 'b':30 }
print(dict3)      #{'a': 20, 'b': 30}

4. 字典的操作

  • ? 查(获取字典的值)

? ? ? a.? 字典[ 键 ]? ? ? ? ? ? ----? ?获取字典中指定键对应的值?

dog = { 'name':'土豆', 'age':3, 'gender':'man'}
print(dog['name'])

### 键要不存在 程序会报错 keyerror

? ? ? b. 字典.get(键)? ? ? ? ----? ?获取字典中指定键对应的值

dog = {'name':'土豆', 'age':3, 'gender':'man'}
print(dog.get('name'))

## 如果键不存在,不会报错 默认返回None

? ? ?c. 字典.get(键, 默认值)。---- 获取字典中指定键对应的值,如果键不存在程序不会报错而是返回默认值。

### 如果键不存在,这样书写的话,会输入‘不存在’

dog = {'name':'土豆', 'age':3, 'gender':'man'}

print(dog.get('type','不存在'))

二. 实际开发中的字典

案例: 定义一个变量保存一个班级信息(实际操作)

class1 = {
    'name': 'SH-python2303',
    'position': '1教',
    'head_teacher': {'name': '曹老板', 'tel': '110', 'gender': '男'},
    'lecturer': {'name': '余婷', 'tel': '120', 'gender': '女'},
    'students': [
        {'name': 'stu1', 'age': 19, 'gender': '男', 'score': 98, 'link_man': {'name': '张三', 'tel': '19283832'}},
        {'name': 'stu2', 'age': 24, 'gender': '女', 'score': 89, 'link_man': {'name': '李四', 'tel': '22349911'}},
        {'name': 'stu3', 'age': 25, 'gender': '女', 'score': 54, 'link_man': {'name': '王五', 'tel': '19292811'}},
        {'name': 'stu4', 'age': 30, 'gender': '男', 'score': 66, 'link_man': {'name': '赵六', 'tel': '82791262'}},
        {'name': 'stu5', 'age': 17, 'gender': '男', 'score': 77, 'link_man': {'name': '小红', 'tel': '771723831'}},
        {'name': 'stu6', 'age': 16, 'gender': '女', 'score': 91, 'link_man': {'name': '小明', 'tel': '191023311'}},
        {'name': 'stu7', 'age': 25, 'gender': '男', 'score': 59, 'link_man': {'name': '老王', 'tel': '1991888118'}},
    ]
}

# 1) 获取班级名称
result1 = class1['name']
print(result1)

# 2) 获取班主任的名字和电话
head_teacher = class1['head_teacher']
print(head_teacher['name'],head_teacher['tel'])

# 3) 获取讲师的名字和性别
lecturer = class1['lecturer']
print(lecturer['name'],lecturer['gender'])

# 4) 获取所有学生的名字
all_student = class1['students']
print(all_student)
for stu in all_student:
    print(stu['name'])



# 5) 获取所有男生的年龄
result5 = [ i['age'] for i in class1['students'] if i['gender'] =='男' ]
print(result5)
print('**************************************************************************')

# 6) 计算所有女生的平均分
girl_scores = [stu['score'] for stu in class1['students'] if stu['gender']=='女']
print(girl_scores)
print(sum(girl_scores)/len(girl_scores))

print('**************************************************************************')


# 7)获取所有学生的联系人电话号码
tels = [stu['link_man']['tel'] for stu in class1['students']]
print(tels)

三. 字典的遍历

dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
for i in dog:
    print('i:', i,dog[i])

'''
i: name 土豆
i: age 19
i: gender 公
i: type 泰迪
'''

四. 字典的增删改

1. 增? ? ---- 增加键值对

  • ? 字典[ 键 ] = 值? ? ? ? ? ? 如果键不存在,就添加键值对。 如果键存在,就修改指定键对应的值
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
# 原字典
print('dog')
#添加元素
dog['color'] = '黄色'
print(dog)
#修改字典的元素
dog['name']='可乐'
print(dog)
  • 字典.setdefault(键, 值)? ? ? -----? 在字典中添加键值对(如果键已经存在不会修改指定键对应的值)
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
### 键不存在 新加入
dog.setdefault('color','黄色')
print(dog)

### 键已经存在,不会改变
dog.setdefault('name','可乐')
print(dog)
?练习# 一个商品列表,写程序给没有折扣的商品添加折扣对应的键值对
goods_list = [
??? {'name': '泡面', 'price': 3.5, 'count': 19, 'discount': 0.8},
??? {'name': '矿泉水', 'price': 1.5, 'count': 70},
??? {'name': '面包', 'price': 7.5, 'count': 5, 'discount': 0.5},
??? {'name': '火腿肠', 'price': 2.5, 'count': 9}
]

for item in goods_list:
???? item.setdefault('discount',1)

print(goods_list)

2. 删? ? ? ----- 删除键值对

  • del 字典[ 键 ]
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
del dog['age']
print(dog)

#{'name': '土豆', 'gender': '公', 'type': '泰迪'}
  • 字典.pop (键)? ? ? ---- 取走字典指定键对应的值,并且返回值
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(dog)

result = dog.pop('gender') ## 公
print(dog, result) # {'name': '土豆', 'age': 19, 'type': '泰迪'}  公

五. 字典的相关操作、函数、方法

?1. 字典不支持 + 、* 和 < 、 >、 <= 、 >=

  • ??in 和 not? in

? ? ? ? ? ? ?判读字典中是否存在指定的键

? 2. 字典的相关函数:len 、 dict

  • len(字典)
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(len(dog))
# 4
  • dict (数据)? ? ? --- 将指定数据转换为字典

? ? ? ?对数据的要求:? a. 数据本身必须是一个容器

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b. 容器中的每个元素必须长度为2 的小容器

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c. 小容器中的第一个元素必须是不可变类型数据

d1 = ['ab', 'cd', 'ef']
d2 = ['ab', range(2)]

# 本身都是容器, 容器每个元素长度都为2 , 且第一个元素都是不可变

3. 字典的相关方法:

? ?a. 字典.clear( )? ? ?-? ?清空字典

? ? ? ? dog.clear()

? ?b. 字典.copy()? ? ? ? - 复制字典 创建一个一模一样的新字典

? ? ? ? dog2 = dog.copy()

? ?c.?字典.keys( )? ?、?字典.values( ) 、 字典.items( )
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
print(dog.keys()) #dict_keys(['name', 'age', 'gender', 'type'])
print(dog.values()) #dict_values(['土豆', 19, '公', '泰迪'])
print(dog.items()) #dict_items([('name', '土豆'), ('age', 19), ('gender', '公'), ('type', '泰迪')])
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}

for key, value in dog.items():
    print(key,value)
d.? 字典1.update(字典2)? ? ? ? ? ??
  • 将字典2中所有键值对都添加到字典1中
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}

dog.update({'a':10,'b':20})
print(dog)

#{'name': '土豆', 'age': 19, 'gender': '公', 'type': '泰迪', 'a': 10, 'b': 20}
e. 字典推导式
  • { 表达式1: 表达式2? for 变量 in 容器 }
  • { 表达式1: 表达式2? for 变量 in 容器? ?if 条件语句 }
练习:利用字典推导式交换字典中键和值的位置
dog = {'name':'土豆', 'age':19, 'gender':'公' ,'type':'泰迪'}
#way1
dog_lst = { v:k for k,v in dog.items() }
print(dog_lst)
#way2
dict1 = {dog[x]:x for x in dog}
print('dict1:', dict1)

六. 元组

?1. 元组的定义:

  • 是一种容器
  • 将( ) 作为容器的标志,里面多个元素用逗号隔开 : ( 数据1, 数据2, 数据3, ....... )
  • 元组是不可变列表(不支持增删改)
  • 元组是有序的(顺序影响结果,支持索引操作)

? 2.元组类型

  • ? 空元组? ? ?t1 = ()?
  • ?只有一个元素元组(唯一元素后必须加逗号) t2 = (10, )? print(t2,type(t2))
  • 在没有歧义的情况下,元组的 ( )可以省略? ----? ?直接多个数据用逗号隔开表示的也是一个元组
  • t10 = 1,2,3,4*10
    print(type(t10))
    #<class 'tuple'>
    

3. 元组的操作

a. 查? ?- 获取元组的元素
  • 元组获取元素的方式和列表一样
movie = ('三傻大闹宝莱坞', '触不可及', '教父','变行金刚','盗梦空间','奥本海默')
print(movie[1],movie[-1],movie[-2])
print(movie[1:-1])
print(movie[0:-2:2])

print('**************************************************************************')

for i in movie:
    print(i)
print('**************************************************************************')


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

????????

b.通过多变量的方式获取元组或者列表中的元素

? ? ? ? 让变量的个数和元组/列表中元素的个数保持一致

point = (10,20,30)
x,y,z = point
print(x,y,z)

a,b,c = 100,200,300

d1 = {'a':10, 'b':20,'c':30}
for k,v in d1.items():
    print(k,v)

lst = [(10,20,30),('a','b','c'),('abc',100,200)]
for x1,x2,x3 in lst:
    print(x1,x2,x3)
c.当变量的个数小于元组/列表中元素的个数

在其中一个变量前面加*。取得时候先让不带*的变量去获取元素,剩下的全部给带*的变量

point =(10,20,30,40,50)
*x,y,z =point
print(y)

'''
y 是40, z是50. 其余的全部给x
'''

point =(10,20,30,40,50)
x,*y,z =point

'''
x = 10, z =50 , 其余给y
'''

文章来源:https://blog.csdn.net/weixin_46659095/article/details/135762868
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。