python字典详解

发布时间:2019-09-20 07:29:22编辑:auto阅读(2017)

    字典是Python中唯一的內建的映射类型,可以存储任意对象的容器,比如:字符串,列表,元组,自定义对象等;字典由键(key)与值(value)组成,基本语法如下:

    {key:value, ... ...}
    字典中每个Key是唯一的,key必须是可哈希(后面我们介绍);

    这节我们来看下字典基本知识点:

    1>字典定义、遍历、修改;
    2>理解字典key;
    4>字典相关函数;

    1.字典定义与访问

    1.1 直接定义字典:

    stocks = {'000001':'平安银行', '000002':'万科A', '000025':'特力A'}
    #000001,000002,000025为key;对应的平安银行,万科A,特力A为value

    1.2 使用dict方法:

    dict是Python的字典类,可以使用字典相关方法定义字典,具体如下:

    #列表或者元组中每个元素必须为列表或者元组且长度为2
    phoneprice = [['小米8青春版',1699], ['华为P20',3188], ['VIVOX23', '2798']]
    pdict = dict(phoneprice)
    print(pdict)

    1.3 使用fromkeys方法:

    方法:dict.fromkeys(iterable, value=None),说明:

    1>将可迭代对象转成字典,字典key为迭代对象每个元素,值为value;
    2>iterable必须为可迭代对象,value默认值为None

    具体操作如下:

    #字符串
    kstr = 'abcd'
    dstr = dict.fromkeys(kstr, 1)
    print('dstr:',dstr)
    #列表:
    klist = ['python','java','C++']
    dlist = dict.fromkeys(klist, 0)
    print(dlist)

    这些就是字典初始化常用的方式。

    1.4 字典访问:

    1)使用key获取值:

    stocks = {'000001':'平安银行', '000002':'万科A', '000025':'特力A'}
    #通过key访问对应value
    print(stocks['000002'])
    print("stocks[{}]:{}".format('000002', stocks['000002']))

    输出结果:

    万科A
    stocks[000002]:万科A

    2)遍历字典:
    通过for循环可以获取字典所有key,具体如下:

    stocks = {'000001':'平安银行', '000002':'万科A', '000025':'特力A'}
    #遍历为字典所有key
    for key in stocks:
        print(key)

    输出结果:

    000001
    000002
    000025

    可以通过Key获取对应的Value:

    stocks = {'000001':'平安银行', '000002':'万科A', '000025':'特力A'}
    #获取为字典所有key
    for key in stocks:
        print(key, stocks[key])

    输出结果:

    000001 平安银行
    000002 万科A
    000025 特力A

    1.5 字典修改:

    1)直接修改:

    #用户名密码
    userinfo = {'uname':'admin', 'pwd':'admin123'}
    print(userinfo)
    #修改密码
    userinfo['pwd'] = 'abcd1234'
    print(userinfo)

    输出结果:

    {'uname': 'admin', 'pwd': 'admin123'}
    {'uname': 'admin', 'pwd': 'abcd1234'}

    2)添加值:

    #用户名密码
    userinfo = {'uname':'admin', 'pwd':'admin123'}
    print(userinfo)
    #添加手机号
    userinfo['phonenum'] = '15022332233'
    print(userinfo)

    输出结果:

    {'uname': 'admin', 'pwd': 'admin123'}
    {'uname': 'admin', 'pwd': 'admin123', 'phonenum': '15022332233'}

    2 字典Key

    1)字典key是唯一的:

    #result中有两个first
    result = {'first':'zhang','Second':'sun', 'first':'li'}
    #first对应值?
    print(result['first'])

    输出结果:li,字典中每个key是唯一的,但是value可以相同;

    2)字典key必须是不可改变对象:
    我们怎么来理解key不可改变?数字,字符串,元组都是不可改变对象,他们可以为key,换一个列表试试:

    info = {}
    info[[1,2,3]] = 1

    输出结果:

    <ipython-input-36-9ce2e27f396d> in <module>
          1 info = {}
    ----> 2 info[[1,2,3]] = 1
    
    TypeError: unhashable type: 'list'

    触发异常,因为列表是不可hash对象。
    所以更好说的说法应该是字典key必须是可以hash对象。不可变的对象才能被hash。
    我们可以直接使用hash这个函数看下处理结果:

    print(hash('a'))
    print(hash(1))
    print(hash((1,2,3)))

    输出结果:

    -99564674986098144
    1
    2528502973977326415

    不同对象的hash值都是唯一的,且hash对象必须是不可改变的。

    3)字典key为什么要hash?
    字典添加访问过程可以简单理解为下图(内部实现可能更加复杂):
    python字典详解
    根据这个简单示意图我们知道key必须可以hash的原因,字典这种实现方式能够很快的找到查找元素。
    所以字典的key必须是不可改变的。

    4)考验下,我们是否真的理解了?

    info = {1:'one', 1.0:'frist'}
    info

    字典info是什么值,大家可以在评论区写出结果。

    3.字典常用操作:

    1)in:判断key是否在字典中;
    抖音上找了几个作品,我们来判断下:

    songs= {'虎二':'不仅仅是喜欢', '摩登兄弟':'走马', '西瓜妹':'花桥流水','M哥':'我的将军啊'}
    print('面筋哥' in songs)
    print('M哥' in songs)

    输出结果:False,True

    2)len:获取字典长度;

    songs= {'虎二':'不仅仅是喜欢', '摩登兄弟':'走马', '西瓜妹':'花桥流水','M哥':'我的将军啊'}
    print(len(songs))

    输出结果:4
    3)del:删除元素;

    songs= {'虎二':'不仅仅是喜欢', '摩登兄弟':'走马', '西瓜妹':'花桥流水','M哥':'我的将军啊'}
    #删除key为虎二的元素
    del songs['虎二']
    print(songs)

    输出结果:{'摩登兄弟': '走马', '西瓜妹': '花桥流水', 'M哥': '我的将军啊'}

    4.字典常用方法详解:

    4.1.获取字典key与元素:

    主要方法如下:

    方法 说明
    D.keys() 获取字典所有ley
    D.values() 获取字典所有value
    D.items() 获取字典所有item

    相关操作如下:

    songinfo = {'虎二':'不仅仅是喜欢', '摩登兄弟':'走马', '西瓜妹':'花桥流水','M哥':'我的将军啊'}
    songer = songinfo.keys()
    print(songer)
    songs = songinfo.values()
    print(songs)
    items = songinfo.items()
    print(items)

    ```输出结果:
    dict_keys(['虎二', '摩登兄弟', '西瓜妹', 'M哥'])
    dict_values(['不仅仅是喜欢', '走马', '花桥流水', '我的将军啊'])
    dict_items([('虎二', '不仅仅是喜欢'), ('摩登兄弟', '走马'), ('西瓜妹', '花桥流水'), ('M哥', '我的将军啊')])

    遍历字典几种方式:
    ```Python
    songinfo= {'虎二':'不仅仅是喜欢', '摩登兄弟':'走马', '西瓜妹':'花桥流水','M哥':'我的将军啊'}
    #获取keys,然后遍历
    #与for key in songs类似
    ks = songinfo.keys()
    for k in ks:
        print(k, songinfo[k])
    print('======')
    #获取字典所有items,然后遍历
    for key, value in songinfo.items():
        print(key, value)

    输出结果:

    虎二 不仅仅是喜欢
    摩登兄弟 走马
    西瓜妹 花桥流水
    M哥 我的将军啊
    ======
    虎二 不仅仅是喜欢
    摩登兄弟 走马
    西瓜妹 花桥流水
    M哥 我的将军啊

    4.2 获取Key对应value

    方法 说明
    D.get(k[,d]) 如果k在D中存在,返回D[k],否则返回d,d默认值为None
    D.setdefault(k[,d]) 如果k在D中存在,返回D[k],否则D[k]=d

    具体操作如下:

    userinfo= {'uname':'lucy', 'pwd':'aabbcc'}
    print(userinfo)
    #获取用户名
    print('{}:{}'.format('uname',userinfo.get('uname')))
    #获取用户年龄
    print('{}:{}'.format('age',userinfo.get('age')))
    #如果密码不存在,设置默认密码,否则返回存在密码
    print('{}:{}'.format('pwd',userinfo.setdefault('pwd', '123456')))
    #如果用户年龄不存在,设置默认值
    print('{}:{}'.format('age',userinfo.setdefault('age', 1)))
    #设置之后,查看字典内容:
    print(userinfo)

    输出结果:

    {'uname': 'lucy', 'pwd': 'aabbcc'}
    uname:lucy
    age:None
    pwd:aabbcc
    age:1
    {'uname': 'lucy', 'pwd': 'aabbcc', 'age': 1}

    4.3 字典删除

    方法 说明
    D.pop(k[,d]) 详细解释看表格下方
    D.popitem() 删除并返回一对key-value,字典为空报错
    D.clear() 删除字典所有元素

    D.pop(k[,d]) 详解:

    1>k为删除键,d为给定返回值;
    2>若k存在,删除k并返回k对应value;
    3>若k不存在,且d有值,返回d;
    4>若k不存在,且没有给定d,触发异常;

    1)使用pop删除:

    #数字货币价格:瑞波币,以太坊,比特币
    BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'}
    print(BiPrice)
    #删除瑞波币
    print('XRP price:',BiPrice.pop('XRP'))
    #删除后结果:
    print('删除后结果:', BiPrice)
    #删除EOS,如果不存在,返回2$
    print('EOS price:',BiPrice.pop('EOS', '$2'))

    输出结果:

    {'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'}
    XRP price: $0.36557
    删除后结果: {'ETH': '$113.60', 'BTC': '$ 4031.6'}
    EOS price: $2

    删除不存在key:

    #数字货币价格:瑞波币,以太坊,比特币
    BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'}
    BiPrice.pop('BCH')

    运行结果:

    KeyError                                  Traceback (most recent call last)
    <ipython-input-77-2507cf08400a> in <module>
          1 #数字货币价格:瑞波币,以太坊,比特币
          2 BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'}
    ----> 3 BiPrice.pop('BCH')
    
    KeyError: 'BCH'

    删除不存在元素,报错。
    2)使用popitem删除:

    #数字货币价格:瑞波币,以太坊,比特币
    BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'}
    print(BiPrice)
    print('popitem:',BiPrice.popitem())
    print('删除后结果:', BiPrice)

    输出结果:

    {'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'}
    popitem: ('BTC', '$ 4031.6')
    删除后结果: {'XRP': '$0.36557', 'ETH': '$113.60'}

    3)使用clear清空字典:

    BiPrice = {'XRP':'$0.36557', 'ETH':'$113.60', 'BTC':'$ 4031.6'}
    print(BiPrice)
    BiPrice.clear()
    print('clear后结果:', BiPrice)

    运行结果:

    {'XRP': '$0.36557', 'ETH': '$113.60', 'BTC': '$ 4031.6'}
    clear后结果: {}

    4.4 字典更新方法:

    方法 说明
    D.update([E, ]**F) 更新字典 ,E为Key-value可迭代对象或者字典

    我们来分析这个方法:

    1>如果E为字典,for k in E: D[k] = E[k];
    2>如果E为可迭代对象,for k, v in E: D[k] = v;
    3>如果**F,for k in F: D[k] = F[k];(**F为可变长关键字参数))

    相关操作如下:

    #一局王者荣耀5V5,某方英雄选择最开始两个:
    heros = {'白起':'上路','嬴政':'中路'}
    #添加射手:
    heros.update({'刘备':'射手'})
    print('增加刘备:',heros)
    #添加夏侯惇与鬼谷子
    heros.update([('夏侯惇', '上路'), ('鬼谷子', '辅助')])
    print('增加两个:', heros)
    #更改夏侯惇分路
    heros.update([('夏侯惇', '打野')])
    print('更改属性:', heros)

    输出结果:

    增加刘备: {'白起': '上路', '嬴政': '中路', '刘备': '射手'}
    增加两个: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '上路', '鬼谷子': '辅助'}
    更改属性: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '打野', '鬼谷子': '辅助'}

    到这里我们对字典就有了基本认识,可以使用字典来解决工作和学习中的问题。

关键字

上一篇: python文件操作详解

下一篇: Python+MySQL