Python字典对象dict入门

现有一个水果篮,里面放了 3 个苹果、10 个橙子、8 个香蕉。大家想一想,如果要用 Python 来记录水果篮里面每种水果的数量,该怎么做呢?

通过 Python列表对象入门 一节,我们知道列表可以用来存储多个数据。因此,我们可以用两个列表 fruitsnumbers ,来分别记录水果的种类和数量:

1
2
>>> fruits = ['apple', 'orange', 'banana']
>>> numbers = [3, 10, 8]

可以看到,两个列表每个槽位存放的数据都是相对应的。例如, fruits[0] 存储的是苹果的英文名 apple ;相应地,numbers[0] 记录了苹果的数量 3

根据约定的存储规律,我们可以这样找出 apple 的个数:

1
2
3
>>> i = fruits.index('apple')
>>> numbers[i]
3

先找出 applefruits 列表中的下标,然后根据下标取出保存在 numbers 列表的数量。这样不仅操作繁琐,而且当待查找的列表越长,耗时也越长。

通过指定值找到与之关联的另一个值,是一种很常见的场景。那么,是否有更能胜任这种场景的数据类型呢?接下来,我们一起来探索本节的主角 —— 字典 对象( dict )。

概述

字典 ( dict ),是一种可变容器对象,用于高效存储 键值对键值对 是一种由 ( key ) 和 ( value ) 组成的关联结构,表示键和值之间存在某种关系。

字典保存键值对,键值对之间以 逗号 分隔,被花括号 {} 包括在内。举个例子,我们可以创建一个 dict 对象,来存储每种水果对应的数量:

1
2
3
>>> fruits_dict = {'apple': 3, 'orange': 10, 'banana': 8}
>>> fruits_dict
{'apple': 3, 'orange': 10, 'banana': 8}

注意到,该字典以水果种类为键( key ),以对应的数量为值 ( value )。 以 'apple': 3 为例,'apple' 为键,3 为值,键和值之间用冒号 : 分隔,表示 apple 的数量是 3

前面提到的花括号和冒号必须是英文符号,否则程序会报错。

编程语言一般使用英文符号。后续如无特别说明,符号均指英文符号。

遍历

字典是一个可迭代对象,因此,我们可以使用 for 语句对它进行遍历:

1
2
3
4
5
6
>>> for name in fruits_dict:
...     print(name)
...
apple
orange
banana

这个 for 语句依次取出字典中每个键值对的 key ,并执行循环体,将它输出到屏幕。

字典还提供了内置方法 keys() ,来获取字典中所有的键:

1
2
>>> fruits_dict.keys()
dict_keys(['apple', 'orange', 'banana'])

可以看到,keys() 方法以字典视图的形式返回了字典中所有的键。

同样,我们用 for 语句来遍历这个字典视图,并将 key 依次输出到屏幕:

1
2
3
4
5
6
>>> for name in fruits_dict.keys():
...     print(name)
...
apple
orange
banana

那么,如果要输出所有的键值对呢?我们可以先调用 items() 方法,得到一个包含所有键值对的字典视图:

1
2
>>> fruits_dict.items()
dict_items([('apple', 3), ('orange', 10), ('banana', 8)])

再对该视图进行遍历,依次打印水果种类和数量:

1
2
3
4
5
6
>>> for name, number in fruits_dict.items():
...     print(name, number)
...
apple 3
orange 10
banana 8

同理,values() 方法返回了一个包含字典中所有值的视图:

1
2
3
4
5
6
>>> for number in fruits_dict.values():
...     print(number)
...
3
10
8

查找

与列表不同,字典以键( key )作为索引,查找速度极快。例如,我们可以这样来查找 apple 的数量:

1
2
>>> fruits_dict['apple']
3

如果待查找的 key 在字典中不存在,Python 就会报错:

1
2
3
4
>>> fruits_dict['pear']
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
KeyError: 'pear'

如果不确定 key 是否在字典里,可以这样来判断:

1
2
3
4
>>> 'pear' in fruits_dict
False
>>> 'apple' in fruits_dict
True

由于 pear 不在字典里面,因此返回 False ;而 apple 存在于字典中,返回 True

修改

果篮中的苹果被吃掉一个,此时数量就变成 2 。那么,如何对字典进行修改呢?

我们可以使用 赋值 语句,为指定 key 设置新 value 。例如,将 apple 的数量改为 2

1
2
3
>>> fruits_dict['apple'] = 2
>>> fruits_dict
{'apple': 2, 'orange': 10, 'banana': 8}

不仅如此,我们还可以先取出水果的数量,对其做减法操作,最后再将结果赋值。假设橙子也被吃掉了一个,我们可以这样更新橙子的数量:

1
2
3
>>> fruits_dict['orange'] = fruits_dict['orange'] - 1
>>> fruits_dict
{'apple': 2, 'orange': 9, 'banana': 8}

例子中,赋值符 = 右边先取出橙子的数量,并进行计算。

通过 -= 赋值运算符,上述语句还可进一步简化。 假设香蕉也被吃掉了一个:

1
2
3
>>> fruits_dict['banana'] -= 1
>>> fruits_dict
{'apple': 2, 'orange': 9, 'banana': 7}

字典是一个可变容器对象,因此它可以随时随地添加数据。假如,果篮又放入 4 个梨:

1
2
3
>>> fruits_dict['pear'] = 4
>>> fruits_dict
{'apple': 2, 'orange': 9, 'banana': 7, 'pear': 4}

删除

‘如果想删除字典中的某个键值对,有两种不同的方式可以实现:

  • pop 方法
  • del 语句

例如,我们调用 pop 方法,删除键为 apple 的键值对:

1
2
3
4
>>> fruits_dict.pop('apple')
2
>>> fruits_dict
{'orange': 9, 'banana': 7, 'pear': 4}

注意到,pop 方法删除指定键值对,并将值返回。

此外,我们还可以用另一种方式来删除键值对 —— del 语句:

1
2
3
>>> del fruits_dict['orange']
>>> fruits_dict
{'banana': 7, 'pear': 4}

这两种方法的区别在于,pop 方法会返回被删除的值,而 del 语句不能。

清空

如果想清空整个字典,则可以调用 clear 方法:

1
2
3
>>> fruits_dict.clear()
>>> fruits_dict
{}

特性

字典是用于存储键值对的容器对象,必须满足以下约束:

  • 同一个 key 只能出现一次;
  • key 必须是 不可变对象
  • value 可以是任意数据类型;

【小菜学Python】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学Python】系列文章首发于公众号【小菜学编程】,敬请关注: