字典是 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('d:',d)
- # 列表:
- klist = ['python','java','C++']
- dlist = dict.fromkeys(kstr, 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)
输出结果:
增加刘备: {'白起': '上路', '嬴政': '中路', '刘备': '射手'}
增加两个: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '上路', '鬼谷子': '辅助'}
更改属性: {'白起': '上路', '嬴政': '中路', '刘备': '射手', '夏侯惇': '打野', '鬼谷子': '辅助'}
到这里我们对字典就有了基本认识, 可以使用字典来解决工作和学习中的问题.
来源: http://www.bubuko.com/infodetail-2868461.html