字典(dict)
字典简介 -> 映射
- 字典属于一种新的数据结构,称为映射(mapping)
- 字典的作用与列表类似,都是用来存储对象的容器
- 列表存储数据的性能很好,但是查询数据的性能很差
- 在字典中,每一个元素都有一个唯一的名字,通过唯一
的名字可以快速查找到指定元素(即使存储数据的性能没有列表好)
- 在字典中可以保存多个对象,每个对象都有一个唯一的名字
这个唯一的名字,我们成其为键(key)-->快速查询value
这个对象,我们称其为值(value)
所以字典,我们也成为 键值对(key-value)结构
每个字典中都可以有多个键值对,而每一个键值对我们称其为一项(item)
创建一个空字典
d = {}
d = dict()
创建一个保存有数据的字典
语法:
{key:value, key:value, key:value}
字典的值value可以是任意对象
字典的键key可以是任意不可变对象(int、str、bool、tuple,但不能是list可变对象)
字典的键key是不能重复的,如果重复那么后面会替换前面
d = {'name':'孙悟空', 'age':18, 'gender':'男'}
为了清楚也可以这么创建:
d = {
'name':'孙悟空',
'age':18,
'gender':'男'
}
可以通过键key来获取值: (列表是用索引来获取值)
d['name'] ---> '孙悟空'
字典的创建
1、使用{}创建字典
语法:{k1:v1, k2:v2, k3:v3}
该加引号的要加上引号
2、使用 dict()函数来创建字典:
d = dict(name='孙悟空', age=18, gender='男')
(每个参数都是一个键值对,参数名就是键key,键不需要加引号,参数名就是值,这种当时创建的字典,key都是字符串)
d['name'] ---> '孙悟空'
dict()可以将一个包含双值子序列的序列转换为字典
- 双值序列:序列中只有两个值,如[1,2]、('a',4)、'ab'
- 子序列:如果序列中的元素也是序列,那我们称这个元素为子序列
[(1,2),(3,4)] ---> 包含双值子序列的序列
d = dict([('name','孙悟空'), ('age',18)])
---> d变成了:{'name':'孙悟空', 'age':18} ---> dict
获取、查看字典的值
1、len() 获取字典中键值对的个数
len(d)
2、in 检查字典中是否包含指点的键(key), 注意不是检查值value
not in 同上
例: 'hello' in d ---> 返回True 或者 False
3、获取字典中的值,根据键key来获取
语法:d[key] ---> key表示键,是字符串,要加引号“''”
d['name']
特殊情况:
当n = 'name'时,d[n],可以不加引号(相当于d['name'])
注:通过[]来获取值时,如果键key不存在,会抛出异常 KeyError
4、get(key[, default]) ---> 该方法用来根据键来获取字典中的值
例:d.get('name') ---> 如果字典中没有该键,会返回None,而不是报错(区别于[]方法)
也可以指定一个默认值default,来作为第二个参数,这样获取不到值时将会返回默认值
例:d.get('name', 'No Value')
d.get('age', 5)
修改字典
d = {'name':'孙悟空', 'age':18, 'gender':'男'}
1、d[key] = value
例:d['name'] = 'sunwukong' # 键存在则修改对应的值
d['address'] = '花果山' # 该键'address'不存在,因此创建键值对'address':'花果山'
2、setdefault(key[, default]) ---> 可以用来向字典中添加key-value
如果key已存在于字典中,则返回key的值,不会对字典做任何操作
如果key不存在,则向字典中添加这个key,并设置value为default(default不设置则默认为None),然后返回default
例:d.setdefault('name', '猪八戒') ---> key:name, default='猪八戒'
d.detdefault('address') ---> 添加了键值对: 'address':None (default默认为None)
3、d.update(d2) ---> 将字典d2中的键值对加入字典d中,若d和d2中有键key重复,则后面的值会替换当前的
4、删除
- del 删除字典中的key-value
语法: del d[key]
del d['name']
del d['age']
不存在key则报错
- popitem()
删除字典中的一个键值对,一般都会删除最后一个键值对
删除之后,它会将删除的key-value作为返回值返回
返回的是一个元组tuple: (key, value)
删除的字典为空字典时,会抛出错误
- pop(key[, default])
根据key删除字典中的key-value
将被删除的value返回
若不指定默认值,如d.pop('name'), 删除不存在的key,则会报错
若指定默认值,如d.pop('name', default), key不存在时,会返回default
- clear()
d.clear() ---> 清空字典
5、copy() ---> 浅复制
- 该方法用于对字典进行浅复制
- 复制以后的对象,跟原对象是相互独立的(若用d1 = d2语句,则d1和d2指向同一个对象,并不相互独立)
d = {'a':1, 'b':2}
d2 = d.copy() ---> d和d2的id不一样,值一样
- 注意,浅复制会简单复制对象内部的值,如果值也是一个可变对象,这个可变对象不会被复制
如: d = {'a':{'name':'孙悟空','age':18}, 'b':2, 'c':3} ---> 内部有一个元素是字典,可变对象
d2 = d.copy()
则 d2 = {'a':{'name':'孙悟空','age':18}, 'b':2, 'c':3}
但是,当d2里的'name'和'age'被修改时,d也会被影响
如:改变d2中的‘name’: d2['a']['name'] = '麦梁诗',则d中的'name'的值也变成'麦梁诗'
(即没有被复制,而是赋值,指向同一对象,因此copy才称为浅复制)
- 但是一般常用浅复制,深复制不常用(性能差)
deepcopy() ---> 深复制(对内外部元素都进行了拷贝对象本身,而不是对象的引用)
遍历字典
1、keys() ---> 该方法会返回字典所有的key, 并返回一个序列(保存有字典中所有的键)
{'name':'孙悟空','age':18, 'a':1, 'b':2, 'c':3}
通过keys()来获取所有的键和值:
for k in d.keys():
print(k, d[k]) ---> 遍历并打印键及其对应的值
2、values()
该方法返回一个序列(保存字典里所有的值)
通过values()来获取所有的值:(不能获取键)
for v in d.values():
print(v) ---> 遍历并打印字典d中的所有值
3、items()
- 该方法会返回字典中所以的项
- 它会返回一个序列(包含双值子序列):(key, value),可以将其进行解包
for k,v in d.items(): ---> 此处为解包过程
print(k, v) ---> 遍历并打印键及其对应的值