python字典详解
- 2020 年 1 月 6 日
- 筆記
字典是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? 字典添加访问过程可以简单理解为下图(内部实现可能更加复杂):

根据这个简单示意图我们知道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)
输出结果:
增加刘备: {'白起': '上路', '嬴政': '中路', '刘备': '射手'} 增加两个: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '上路', '鬼谷子': '辅助'} 更改属性: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '打野', '鬼谷子': '辅助'}
到这里我们对字典就有了基本认识,可以使用字典来解决工作和学习中的问题。