字典相关操作和方法

 

认识字典

 
# 1. 字典的作用
# 需求:定义一个变量保存一个学生的信息

stu = ['小明', 32, '电子信息', 170, 80, 90]
print(stu[1])

stu = {
    'name': '小明',
    'age': 32,
    '专业': '电子信息',
    'height': 170,
    'weight': 80,
    'score': 90
}
print(stu['age'])
# 2. 字典和列表的选择
"""
如果要保存多个意义不同的数据,就使用字典;要保存多个意义相同的数据就用列表
"""

# 3.什么是字典(dict)
"""
字典是系统类型,属于容器型数据类型(序列);
将{}作为容器的标志,里面多个键值对(元素)用逗号隔开: {键1:值1, 键2:值2, 键3:值3, ...}

字典是可变(支持增删改);字典是无序(不支持下标操作;顺序不影响结果)

键  -  键必须是不可变类型的数据(数字、字符串、布尔、空值、元组); 键唯一(同一个字典中同一个键只能出现一次)
值  -  没有要求(任何类型的数据)
"""
# 字典无序
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10})     # True

# 键不可变
dict1 = {10: 20, 'a': 30, (10, 20): 40}
# dict2 = {10: 20, 'a': 30, [10, 20]: 40}       # 报错

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

# 空字典
dict4 = {}

字典的查操作

# 字典存储数据真正想要保存的是值,键只是用来对值进行区分和说明的(相当于列表中元素的下标)

# 1. 查单个  -  获取单个值
"""
1)字典[键]         -   获取字典中指定键对应的值,如果键不存在程序会报错
2)字典.get(键)     -   获取字典中指定键对应的值,如果键不存在不会报错并且会返回None
3)字典.get(键, 默认值)   -  获取字典中指定键对应的值,如果键不存在不会报错并且会返回默认值
"""

dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}

print(dog['type'])
print(dog['name'])
# print(dog['weight'])        # KeyError: 'weight'

print(dog.get('price'))
print(dog.get('color'))
print(dog.get('weight'))        # None

print(dog.get('age', 0))
print(dog.get('color', '白色'))
print(dog.get('weight', 5))         # 5
# 2.生活中列表和字典
# 需求:结合实际定义一个变量保存一个班级的信息
# 班级信息:班级名、教室、讲师、班主任、学生
class1 = {
    'className': 'Python2205',
    'classRoom': '11教',
    'lecturer': {'name': '余婷', 'age': 18, 'tel': '13678192302', 'gender': '女'},
    'classTeacher': {'name': '燕子姐', 'age': 18, 'tel': '119', 'QQ': '8282821'},
    'students': [
        {'name': 'stu1', 'age': 19, 'tel': '1922333', 'gender': '男', 'linkman': {'name': '张三', 'tel': '11923'}},
        {'name': 'stu2', 'age': 28, 'tel': '8727832', 'gender': '男', 'linkman': {'name': '小明', 'tel': '19202'}},
        {'name': 'stu3', 'age': 30, 'tel': '291912', 'gender': '女', 'linkman': {'name': '李四', 'tel': '1910283'}},
        {'name': 'stu4', 'age': 17, 'tel': '2349183', 'gender': '男', 'linkman': {'name': '老王', 'tel': '109221567'}},
        {'name': 'stu5', 'age': 16, 'tel': '27273482', 'gender': '女', 'linkman': {'name': '王五', 'tel': '119283427'}},
        {'name': 'stu6', 'age': 22, 'tel': '1242402', 'gender': '男', 'linkman': {'name': '赵六', 'tel': '2091834'}}
    ]
}

# 1)获取班级名称
print(class1['className'])

# 2)获取讲师的名字和电话
teacher = class1['lecturer']
print(teacher['name'], teacher['tel'])

# 3)获取班主任的名字和QQ
print(class1['classTeacher']['name'], class1['classTeacher']['QQ'])

# 4)打印所有学生的名字
result = [x['name'] for x in class1['students']]
print(result)

for stu in class1['students']:
    print(stu['name'])

# 5)计算所有男生的平均年龄
total_age = count = 0
for stu in class1['students']:
    if stu['gender'] == '男':
        total_age += stu['age']
        count += 1
print('男生的平均年龄:', total_age / count)


# 6)打印所有女学生的联系人的电话
for stu in class1['students']:
    if stu['gender'] == '女':
        print(stu['linkman']['tel'])

# 3.遍历字典  - 一个一个的获取字典所有的值
"""
方法1:
for 变量 in 字典:
    循环体(变量获取到的是字典的键)
    
方法2:
for 变量1,变量2 in 字典.items():
    循环体(变量1依次取到的是所有的键,变量2依次取到的是所有的值)
"""
print('------------------------------------------华丽的分割线------------------------------------------------')
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
for x in dog:
    print(x, dog[x])

print('------------------------------------------华丽的分割线------------------------------------------------')
for key, value in dog.items():
    print(key, value)

字典的增删改

# 1.增(添加键值对)、改(修改某个键对应的值)
"""
1)字典[键] = 值     -   如果键不存在就添加键值对;如果键存在就修改指定键对应的值
2)字典.setdefault(键, 值)       -   添加键值对(只会在键不存在的时候实现添加的功能,键存在无作为)
"""

stu = {'name': '小明', 'age': 18, 'height': 177}
print(stu)

stu['weight'] = 70
print(stu)      # {'name': '小明', 'age': 18, 'height': 177, 'weight': 70}

stu['age'] = 28
print(stu)      # {'name': '小明', 'age': 28, 'height': 177, 'weight': 70}

print('------------------------------------------华丽的分割线------------------------------------------------')
stu = {'name': '小明', 'age': 18, 'height': 177}

stu.setdefault('weight', 80)
print(stu)

stu.setdefault('age', 30)
print(stu)
# 案例:给没有折扣的商品添加折扣值为1

goods = [
    {'name': '火腿肠', 'price': 1.5, 'count': 53, 'discount': 0.9},
    {'name': '泡面', 'price': 3.5, 'count': 100},
    {'name': '矿泉水', 'price': 1, 'count': 135},
    {'name': '面包', 'price': 5.5, 'count': 10, 'discount': 0.75}
]
for x in goods:
    x.setdefault('discount', 1)
print(goods)

# 2.删  - 删除键值对
# 1)del 字典[键]       -       删除指定键对应的键值对
print('------------------------------------------华丽的分割线------------------------------------------------')
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
del stu['height']
print(stu)      # {'name': '小明', 'age': 18, 'gender': '男'}

# 2)字典.pop(键)       -       取出字典中指定键对应值并且返回
stu = {'name': '小明', 'age': 18, 'height': 177, 'gender': '男'}
result = stu.pop('gender')
print(stu, result)      # {'name': '小明', 'age': 18, 'height': 177} 男

字典的相关操作和函数

# 1. 字典不支持+、*和比较大小,只支持比较是否相等
# 2. in 和 not in        -       判断字典中是否存在指定键
"""
键 in 字典
键 not in 字典
"""

dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(3 in dog)     # False
print('name' in dog)        # True

# 3.len
print(len(dog))
# 4.dict
"""
dict(数据)        -       将指定数据转换成字典
数据的要求:1)数据本身是一个大序列
          2)大序列中的每个元素是有且只有两个元素的小序列,并且小序列中的第一个元素是不可变类型的数据
"""
data1 = ['ab', [10, 20], '10']
print(dict(data1))      # {'a': 'b', 10: 20, '1': '0'}

data2 = [('age', 20), ('name', '张三'), ('gender', '男')]
print(dict(data2))      # {'age': 20, 'name': '张三', 'gender': '男'}

字典的相关方法

# 字典.xxx()


# 1.字典.clear()  - 清空字典
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog.clear()
print(dog)

# 2.字典.copy()   -   复制字典产生一个一模一样的新字典,并且将新的字典返回
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
dog1 = dog.copy()
print(dog1)
# 3.
"""
字典.keys()       -       获取字典所有的键并且返回
字典.values()     -       获取字典所有的值并且返回
字典.items()      -       将字典中的每个键值对转换一个一个的元组作为序列中的元素返回
"""

print(dog.keys())       # dict_keys(['name', 'age', 'type', 'price', 'color'])
print(dog.values())     # dict_values(['旺财', 3, '土狗', 30000, '黄色'])
print(dog.items())      # dict_items([('name', '旺财'), ('age', 3), ('type', '土狗'), ('price', 30000), ('color', '黄色')])
# 4.字典1.update(字典2)     -       将字典2中的键值对全部添加到字典1中
dog.update({'a': 10, 'b': 20, 'age': 10})
print(dog)

拷贝问题

# 拷贝  -  复制数据产生一个一模一样的新数据
# 1. 直接赋值和拷贝的区别
a = [10, 20, 30, 40]
b = a      # 直接赋值赋的是地址
print(b)

c = a.copy()        # 拷贝是赋值原数据产生一个一模一样的新数据,并且将新的数据的地址返回
print(c)

a.append(100)
print('a:', a)
print('b:', b)
print('c:', c)
print('------------------------------------------华丽的分割线------------------------------------------------')
# 2.浅拷贝和深拷贝
from copy import copy, deepcopy
# 浅拷贝:列表.copy()、字典.copy()、列表[:]、copy(可变数据)   (只拷贝对象本身,对象中的子对象不拷贝)
# 深拷贝:deepcopy(可变数据)        (既拷贝对象本身,也会拷贝对象中的子对象)
list1 = [10, 20, 30, 40]

list2 = copy(list1)     # list2 = list1.copy();  list2 = list1[:]
list3 = deepcopy(list1)
print('修改前:')
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

print('修改后:')
list1.append(100)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

print('------------------------------------------华丽的分割线------------------------------------------------')
list1 = [10, [100, 200], 20, 30]
list2 = copy(list1)
list3 = deepcopy(list1)
print('修改前:')
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

list1.append(100)
print('修改方式1后:', list1)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)


list1[1].append(50)
print('修改方式2后:', list1)
print('浅拷贝的list2', list2)
print('深拷贝的list3', list3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值