字典

字典是什么

目前为止,Python中最常用的数据类型,我们只剩下一个字典还没有给大家介绍了。

字典是Python开发中非常重要的一种数据类型。

为什么呢? 因为字典这种数据类型 提供了一种特别的功能, 就是 存放键值对数据。

什么是键值对数据?

比如, 一个游戏系统 里面会存储 用户信息。

系统 经常需要 查询某个用户的信息,比如 某个用户的等级、装备等。

那么根据什么去查找该用户的信息呢? 根据 唯一标志 该用户的属性,比如 用户登录名 或者 用户分配的ID号 等。

根据 登录名1 就查到 用户1 的信息

根据 登录名2 就查到 用户2 的信息

这样就形成了如下 的一种 从 登录名 到 用户信息数据 的映射关系

image

上图中

登录名1就是键(英文叫Key), 用户1 就是值(英文叫Value);

登录名2就是键, 用户2就是值。

每个对应的帐号 和 会员数据 就形成了一个键值对。

要存储像这样 一对一的映射关系的数据结构,在Python中就可以使用字典这种数据类型。

字典的定义

字典对象的键对象的类型 必须是可用哈希算法进行哈希值计算的对象, 通常是 数字 或者 字符串

而值可以是任何类型的 对象,包括 数字、字符串、列表、元组、字典、自定义类型 等等均可。


字典对象定义用花括号 {} , 其中的 的每个元素之间用 逗号 隔开。

每个元素都是一个键值对,键和值之间用 冒号 隔开。


上面例子中,如果每个帐号的信息比较简单,比如只有等级信息,就定义成这样

members = {
    'account1'  : 13 ,
    'account2'  : 12 
}

上面的字典对象 键就是帐号,值就是一个数字对象,表示等级的数字。


用户账号信息,如果复杂一些,包括 等级、点卡数,可以是这样的

members = {
    'account1'  : {'account':'account1', 'level': 13, 'point':3000} ,
    'account2'  : {'account':'account2', 'level': 12, 'point':36000} 
}

上面的字典对象 键就是帐号,值也是一个字典对象。 这个值字典对象中又 包含了 帐号、等级、积分信息。



字典对象的一个特点就是 : 根据 键 去查找 值 非常的方便高效,

比如 members['account1'] 就可以得到 键为 ‘account1’ 的 元素的值

members = {
    'account1'  : 13 ,
    'account2'  : 12 
}
print(members['account1'])

最后一句代码打印出的结果就是 13


字典对象可以存储非常多的元素。理论上 只要内存够大,字典的元素的数量是没有限制的。

字典对象 存储元素有特别的优化, 根据 键 查找值的效率非常高,速度非常快,特别适合查找数据这样的操作。


字典对象的键是唯一的,不可能有两个元素具有相同的键。如果我们这样定义一个字典对象

members = {
    'account1'  : 13 ,
    'account1'  : 12 
}
print(members)

就会发现输出的结果是

{'account1': 12}

相同的键,后面的元素会替换前面的元素。



根据键去获取值,是这样的语法 var[key]

如果给出的 keyvar 这个字典中不存在就会报错了。

比如

members = {
    'account1'  : 13 ,
    'account2'  : 12 
}
print(members['account99'])

就会出现这样的错误,说明key不存在

KeyError: 'account99'


添加、修改、删除

像列表对象一样,字典对象的内容是可以改变的。

我们可以这样定义一个空字典

members = {}

要在字典对象中添加元素非常简单,像这样

members['account1'] = 13

members 的内容就变成了

{
    'account1'  : 13 
}

继续添加元素

members['account2'] = 12

members 的内容就变成了

{
    'account1'  : 13 ,
    'account2'  : 12 
}


如果我们要修改一个元素key对应的value为另外的值,也是这样

members['account2'] = 88

members 的内容就变成了

{
    'account1'  : 13 ,
    'account2'  : 88 
}

大家可以发现:

像这样的赋值语句

var[key] = something

括号里面的key值:

如果在字典中不存在,就是添加元素的的操作,

如果已经存在,就是重新赋值操作。 因为字典不允许有相同的key


如果我们要删除一个元素,可以使用字典对象的pop方法。 像这样

members = {
    'account1'  : 13 ,
    'account2'  : 12 
}

val = members.pop('account1')
print(members)
print(val)

pop方法还会返回参数 key 对应的 value 对象,所以上面的代码执行后,变量val 的值就是 13

而members 的内容则变成了

members = {
    'account2'  : 12 
}


有时候,我们要检查字典对象中是否有我们要找的元素,可以通过 in 这个关键字 ,比如

a in var   # 检查 a 是否在var 中存在,存在返回True,否则返回False

而 not in 则判断是否不存在,比如

a not in var   # 检查 a 是否不在var 中,存在返回 False,否则返回 True

具体的例子如下:

members = {
    'account1'  : 13 ,
    'account2'  : 12 
}

if 'account1' in members:
    print('account1 在字典中存在')


if 'account88' not in members:
    print('account88 不在字典中')


访问字典的所有元素

我们有时需要访问字典的每一个元素,这个也叫遍历字典。

比如,我们需要打印出下面 会员信息字典 中的 每个会员的等级。怎么办?

通常我们使用字典对象的items方法,像这样:

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

for account,level in members.items():
    print (f'account:{account}, level:{level}')

items方法,返回的是一个类似列表一样的对象,其中每个元素就是 键值组成的元组

上面的字典,其items方法返回的是类似这样的对象

[('account1', 13), ('account2', 12), ('account3', 15)]

用for 循环, account level 两个变量就依次对应其中的每个元组里面的 两个元素,完成遍历。

其他常用方法

得到所有的 key 和value 对象

前面我们介绍了 items 方法, 返回的是 将字典 所有的 键值对元组 存入的 一个类似列表的对象

比如:

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

members.items()

返回的是类似这样的对象

[('account1', 13), ('account2', 12), ('account3', 15)]


而字典还有 keys 方法, 返回的是 将字典 所有的 键 存入的 一个类似列表的对象

比如:

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

members.keys()

返回的是类似这样的对象

['account1', 'account2', 'account3']


而字典还有 values 方法, 返回的是 将字典 所有的 键 存入的 一个类似列表的对象

比如:

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

members.values()

返回的是类似这样的对象

[13, 12, 15]


清空字典

clear 方法可以清空字典对象里面的所有元素

比如

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

members.clear()

print(members)


可能有的朋友就想,我们给字典对象重新赋值不也就等于清空字典吗?

比如

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

members = {}

print(members)

这两种做法,虽然最后 members 变量指向的对象 都是一个空字典。 但是最大的区别就在于

clear方法, members 变量 指向的还是原来的字典对象。

而 重新赋值的方法, members 变量 指向的 就是一个新的空字典对象。 原来的字典对象呢? 因为没有被引用,就会被Python解释器在合适的时候 从内存中清除掉。

和另外一个字典合并

有的时候,我们需要把字典里面加上另外一个字典的内容, 可以使用update方法,比如

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}

another =  {
    'account4'  : 13 ,
    'account5'  : 12 ,
}

members.update(another)

print(members)

这样,就在 members字典里面加上了 another字典里面的所有元素。

得到字典元素的个数

如果需要得到字典元素的个数,就使用Python的内置函数 len 即可

比如

members = {
    'account1'  : 13 ,
    'account2'  : 12 ,
    'account3'  : 15 ,
}


print(len(members)) # 结果为3,表示字典中有3个元素




课后练习

去做练习

上一页 下一页