4.3 字典

字典(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)           ---> 遍历并打印键及其对应的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值