什么是字典以及字典的特性
一 什么是字典
dict全称dictionary,使用键-值(key-value)存储,value值可以是任意数据类型: int,float,long, complex, list, tuple,set, dict
1) 定义一个空字典
定义空字典:{ } ,dict( )
2) 根据已有的数据创建字典
d = dict(a=1, b=2)
print(d, type(d))
users = ['user1', 'user2']
passwds = ['123', '456']
可以将两个列表转换成列表里面嵌套元组,也可以直接将其转换成字典
二 字典的特性
1)
字典同集合一样,只支持成员操作符
成员操作符, 默认判断key值是否存在
2) for循环
for循环: 默认遍历字典的key值
for+index:
3) fromkeys第一个参数可以列表/tuple/str/set, 将列表的每一个元素作为字典的key值,
并且所有key的value值一致, 都为'000000';
print({}.fromkeys({'1', '2'}, '000000'))
eg:随机生成100张卡号, 卡号的格式为610 334455 001 ---610 334455 100,其密码都为666666
三 字典的增删改查
1) 增加
1> d = dict(a=1, b=2)
d['g'] = 10 #字典中没有,为添加
d['a'] = 10 #字典中已存在,为修改
print(d)
2> update:
# 如果key值已经存在, 更新value值;
# 如果key值不存在, 添加key-value值;
d.update({'a':4, 'f':1})
print(d)
3> setdefault
# 如果key值已经存在, 不做修改;
# 如果key值不存在, 添加key-value值;默认情况下value值为None
d.setdefault('g', 10)
print(d)
2) 删除
1> pop:弹出指定key-value值
2> popitem:
3> del:
4> clear:
3) 修改,查看
services = { ' http ' : 80 , ' mysq l ' : 3306 }
查看字典里面所有的key值
print(services.keys())
查看字典里面所有的value值
print(services.values())
查看字典里面所有的key-value值
print(services.items())
4) 遍历:
1> 直接的遍历value值
2> 间接的遍历value值
5) 查看指定key对应的value值
注意: key不存在, 就会报错
判断key值存不存在
6) get方法获取指定可以对应的value值
如果key值存在, 返回对应的value值;
如果key值不存在, 默认返回None, 如果需要指定返回的值, 传值即可
7) 列表的去重
1> 转换为集合(集合是不能重复的)
li = [1, 2, 3, 4, 65, 1, 2, 3]
print(list(set(li)))
2> 通过字典的方式去重(字典的key值是不能重复的)
li = [1, 2, 3, 4, 65, 1, 2, 3]
print({}.fromkeys(li).keys())
四 关于字典的一些案例分析
1) 重复的单词: 此处认为单词之间以空格为分隔符, 并且不包含,和.;
1. 用户输入一句英文句子;
2. 打印出每个单词及其重复的次数
method 1:
method 2:
2) swhich语句
python里面不支持switch语句
但是可以通过字典来间接实现swhich功能
也可以通过字典的 get 功能来更加快速的实现
五 is 和 == 的区别
变量:
id: 在内存中存储的位置;id(a)
value:==
type:变量的数据类型;type(a)
==:value, type
is: 三个都判断
如果:a is b ====> True, a==b一定相等, 返回True;
但是,a==b ====> True, a is b 不一定
六 深拷贝和浅拷贝的区别
直接赋值(li1 = li): 只传递对象的引用, li1指向对象li的内存地址空间,
因此, 原有列表li改变, 被赋值的li1也会做相应的改变.
浅拷贝(三种实现方式 eg: li2=li.copy()):li和li2的内存地址不同,
但是子对象的内存地址相同, 因此,原始数据改变 , 子对象也改变.
深拷贝(import copy, eg: li3=copy.deepcopy(li)), li和li3的内存地址不同,
包含子对象的拷贝, 所以原始对象改变并不会造成深拷贝里面任何子项的改变.
### 当深拷贝和浅拷贝, 针对的对象全部是不可变数据类型时, 两者效果相同;
### 当深拷贝和浅拷贝, 针对的对象包含是可变数据类型时, 两者才有上述区别
浅拷贝的实现:
- li . copy ( )
- li [ : ]
- copy . copy ( li )
实现深拷贝:
- copy . deepcopy( li )