字典
- 字典的作用
看案例:
#列表
stu = ['小明', 32, '电子信息', 170, 80, 90]
print(stu[1])
#字典
stu = {
'name': '小明',
'age': 32,
'专业': '电子信息',
'height': 170,
'weight': 80,
'score': 90
}
print(stu['age']) #32
-
字典和列表的选择
如果要保存多个意义不同的数据,就使用字典;要保存多个意义相同的数据就用列表
-
什么是字典(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)字典[键] - 获取字典中指定键对应的值,如果键不存在程序会报错
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog['type'])#土狗
print(dog['name'])#旺财
2)字典.get(键) - 获取字典中指定键对应的值,如果键不存在不会报错并且会返回None
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog.get('price'))#30000
print(dog.get('color'))#黄色
print(dog.get('weight'))#None
3)字典.get(键, 默认值) - 获取字典中指定键对应的值,如果键不存在不会报错并且会返回默认值
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(dog.get('color'))#黄色
print(dog.get('weight',10))#10
print(dog.get('sex','公'))#公
4)遍历字典: 一个一个的获取字典所有的值
"""
方法1:
for 变量 in 字典:
循环体(变量获取到的是字典的键)
方法2:
for 变量1,变量2 in 字典.items():
循环体(变量1依次取到的是所有的键,变量2依次取到的是所有的值)
"""
看案例:
#方法一:获取键:值
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
for x in dog:
print(x, dog[x])
#方法二:获取键:值
for key, value in dog.items():
print(key, value)
字典的增、改
1)字典[键] = 值 :如果键不存在就添加键值对;如果键存在就修改指定键对应的值
案例:
有相同的键则修改,无相同的键则增加
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}
2)字典.setdefault(键, 值):添加键值对(只会在键不存在的时候实现添加的功能,键存在无作为)
stu = {'name': '小明', 'age': 18, 'height': 177}
stu.setdefault('weight', 80)
print(stu)
stu.setdefault('age', 30)
print(stu)
字典的删
1)del 字典[键] - 删除指定键对应的键值对
案例:
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、键 in 字典、键 not in 字典
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(3 in dog) # False
print('name' in dog) # True
2、len
dog = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
print(len(dog))#5
3、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': '男'}
字典相关方法
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) #返回和dog一模一样的字典
-
直接赋值和拷贝的区别
a = [10, 20, 30, 40] b = a # 直接赋值赋的是地址 print(b) #[10, 20, 30, 40] c = a.copy() # 拷贝是赋值原数据产生一个一模一样的新数据,并且将新的数据的地址返回 print(c) #[10, 20, 30, 40] a.append(100) print('a:', a)#a: [10, 20, 30, 40, 100] print('b:', b)#b: [10, 20, 30, 40, 100] print('c:', c)#c: [10, 20, 30, 40]
-
浅拷贝和深拷贝
浅拷贝:列表.copy()、字典.copy()、列表[:]、copy(可变数据) (只拷贝对象本身,对象中的子对象不拷贝)
深拷贝:deepcopy(可变数据),(既拷贝对象本身,也会拷贝对象中的子对象)
看案例:
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)
# 修改前:
# 浅拷贝的list2 [10, [100, 200], 20, 30]
# 深拷贝的list3 [10, [100, 200], 20, 30]
# 修改方式1后: [10, [100, 200], 20, 30, 100]
# 浅拷贝的list2 [10, [100, 200], 20, 30]
# 深拷贝的list3 [10, [100, 200], 20, 30]
# 修改方式2后: [10, [100, 200, 50], 20, 30, 100]
# 浅拷贝的list2 [10, [100, 200, 50], 20, 30]
# 深拷贝的list3 [10, [100, 200], 20, 30]
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 = {'name': '旺财', 'age': 3, 'type': '土狗', 'price': 30000, 'color': '黄色'}
#有相同键则修改,无则增加
dog.update({'a': 10, 'b': 20, 'age': 10})
print(dog)