文章大纲
通过名称来访问其各个值的数据结构称为映射(mapping),映射中的值不按顺序排序,而是存储在 key 中,key 可以是数字、字符串、元组。在 Python 中字典(dict)是唯一的内置映射类型。
字典
字典这种数据结构不像列表是有序的,字典是无序的,意味着能够通过指定的 key 来快速访问到对应的 value。
创建和使用字典
字典由键和对应的值组成,这种键值对称为项(item),键值之间使用冒号(:)分隔,项目之间使用逗号(,),整个字典放在花括号内。
在映射类型中,键必须为唯一。
类 dict
Python 提供了内置的 dict
类,借助 dict
可以方便的创建字典。
items = [('name', 'imxcai'), ('blog', 'www.imxcai.com')]
d = dict(items)
d
{'name': 'imxcai', 'blog': 'www.imxcai.com'}
type(d)
<class 'dict'>
也可以通过关键字实参来调用函数:
d = dict(name='imxcai', blog='www.imxcai.com')
d
{'name': 'imxcai', 'blog': 'www.imxcai.com'}
直接调用 dict
将返回一个空字典。
字典的基本操作
映射的基本操作类似于序列:
len(d)
返回字典d
包含项的个数(长度)d[k]
返回与键k
项关联的值d[k]=v
将值v
关联到键k
del d[k]
删除键为k
的项k in d
检查字典d
中是否包含键为k
的项
与序列的不同之处有:
- 键的类型:字典中的键可以是任何不可变的类型,如浮点数、字符串或元组
- 自动添加:即便是字典中没有的键也可以赋值,会创建对应的新项
- 成员资格:成员资格查找的是键而不是值
将字符格式用于字典
在字典中存储一系列命名的值,可让格式设置更加容易,通过使用 format_map
来指定映射来提供所需的数据。
temp = "Hello, I'm {name}, my blog is {blog}"
info={'name': 'imxcai', 'blog':'www.imxcai.com'}
print(temp.format_map(info))
Hello, I'm imxcai, my blog is www.imxcai.com
字典方法
与列表、字符串一样,字典也有内置方法。
clear
clear
删除字典中所有的项:
info
{'name': 'imxcai', 'blog': 'www.imxcai.com'}
info.clear()
info
{}
copy 与 deepcopy
copy
返回一个新的字典,项与源字典相同,但值本身是原件而非创建的副本,这种方式称为“浅复制”。
a = {'user': 'admin', 'operator':['add', 'del', 'remove', 'copy']}
b = a.copy()
b
{'user': 'admin', 'operator': ['add', 'del', 'remove', 'copy']}
b['user'] = 'manager'
b
{'user': 'manager', 'operator': ['add', 'del', 'remove', 'copy']}
a
{'user': 'admin', 'operator': ['add', 'del', 'remove', 'copy']}
b['operator'].remove('copy')
b
{'user': 'manager', 'operator': ['add', 'del', 'remove']}
a
{'user': 'admin', 'operator': ['add', 'del', 'remove']}
上述字典中列表在 b
上删除后也影响到了 a
,因为值本身是原件。
deepcopy
深复制,可解决此问题:
from copy import deepcopy
a = {'user': 'admin', 'operator':['add', 'del', 'remove', 'copy']}
b = a.copy()
c = deepcopy(a)
a['operator'].remove('copy')
a
{'user': 'admin', 'operator': ['add', 'del', 'remove']}
b
{'user': 'admin', 'operator': ['add', 'del', 'remove']}
c
{'user': 'admin', 'operator': ['add', 'del', 'remove', 'copy']}
fromkeys
fromkeys
创建新字段,包含指定的键,但每个键对应的值为 None
。
{}.fromkeys(['name', 'age'])
{'name': None, 'age': None}
也可以指定默认的只:
{}.fromkeys(['name', 'age'], 'NULL')
{'name': 'NULL', 'age': 'NULL'}
get
get
用于获取字典中指定键的值,如果字典中不存在指定的键,不会返回错误:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
a.get('url')
a.get('blog')
'www.imxcai.com'
items
items
返回包含所有字典项的列表,每个元素都以 (key, value)
的形式构成,返回的列表顺序是不确定的。
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
a.items()
dict_items([('name', 'imxcai'), ('blog', 'www.imxcai.com')])
返回的值是一种名为字典视图的特殊类型,可以进行迭代,也可以确定长度和执行成员资格的检查:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
b = a.items()
len(b)
2
('name', 'imxcai') in b
True
将字典视图复制到列表中:
list(a.items())
[('name', 'imxcai'), ('blog', 'www.imxcai.com')]
keys
kyes
返回字典的 key
视图:
a.keys()
dict_keys(['name', 'blog'])
values
values
返回字典的 values
视图,在字典中 value
是不唯一的,所以返回的可能会存在重复的值:
a = {}.fromkeys([1,2,3])
a[1] = 1
a [2] =2
a[3] =1
a
{1: 1, 2: 2, 3: 1}
a.values()
dict_values([1, 2, 1])
pop
pop
通过指定键来删除对应的项:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
a.pop('name')
'imxcai'
a
{'blog': 'www.imxcai.com'}
popitem
随机在字典中删除一个项:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
a.popitem()
('blog', 'www.imxcai.com')
a
{'name': 'imxcai'}
setdefault
类似与 get
,当字典中不存在指定的键时,将添加指定的键:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
a.setdefault('name', 'N/A')
'imxcai'
a.setdefault('email', 'imxcai@gmail.com')
'imxcai@gmail.com'
a
{'name': 'imxcai', 'blog': 'www.imxcai.com', 'email': 'imxcai@gmail.com'}
update
update
可用一个字典中的项来更新另一个字典:
a = {'name': 'imxcai', 'blog': 'www.imxcai.com'}
b={'email': 'imxcai@gmail.com', 'blog': 'https://www.imxcai.com'}
a.update(b)
a
{'name': 'imxcai', 'blog': 'https://www.imxcai.com', 'email': 'imxcai@gmail.com'}