Python 基础学习06:字典

通过名称来访问其各个值的数据结构称为映射(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'}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

滚动至顶部