字典及基本操作
在 Python 中, 字典通过特定的键(key
),查找对应的值(value
)。键和值之间是一一对应的映射关系。字典是 Python 中唯一内置的、核心的映射类型。
字典通过一对花括号 {}
来 标识。 字典与列表、元组不同, 其每个元素由键和值两个部分构成, 键和值之间用冒号 :
隔开。不同键值对使用逗号隔开。
1
| {<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>}
|
相对于列表和元组,字典有以下一些属性:
- 字典是无序的。
- 字典是可变的。
- 字典的键必须是不可变类型。
- 字典的键不能重复。
- 通过键而不是索引序号来获取值。
创建字典
字典可以通过一对花括号{}
或者dict
函数来创建。
1 2
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic)
|
使用dict
函数创建字典时,可以将由键值元组构成的序列作为参数。
1 2 3
| dic = dict([('C', '1972'), ('C++', '1979'), ('Java', '1995'), ('Python', '1989')]) print(dic)
|
访问字典的值
字典最主要的用法是查找与特定键相对应的值, 可通过索引符号来实现。
1 2
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic['C'])
|
通过键来获取值时, 键必须是存在的, 否则将触发KeyError
的异常。
1 2
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic['C#'])
|
由于字典是无序的,因此不能像列表那样切片。
1 2
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic['C':'Java'])
|
修改字典的值
当键存在时, 可以通过类似列表元素赋值的方式, 给字典的键赋值来修改键所对应的值。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} dic['C'] = '666' print(dic)
|
添加键值对
当键不存在时, 也可以为它赋值, 这样 Python 会自动为该字典添加新的键值对。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} dic['C#'] = '2000' print(dic)
|
删除键值对
通过 Python 的内置函数del
可以删除字典中的键值对。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} del dic['C'] print(dic)
|
在删除时应给出需要删除的键,如果只给出字典变量本身,则会删除整个字典变量。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} del dic print(dic)
|
字典的常用方法
字典有多种特定的方法,如下表所示,其中dic
为字典变量。
函数和方法 | 描述 |
---|
dic.keys() | 返回所有的键信息 |
dic.values() | 返回所有的值信息 |
dic.items() | 返回所有的键值对 |
dic.get(k,d) | 键存在则返回相应值,否则返回默认值 |
dic.pop(k[,d]) | 键存在则返回相应值,同时删除键值对,否则返回默认值 |
dic.popitem() | 随机从字典中取出一个键值对,以元组(key, value)形式返回 |
dic.clear() | 删除所有的键值对 |
del dic[key] | 删除字典中某一个键值对 |
key in d | 如果键在字典中返回True,否则返回False |
keys()、values() 和 items() 方法
keys()
、values()
和 items()
这三个方法返回类似列表的值, 分别对应字典的键、值和键值对。返回的数据类型(dict_keys
、dict_values
和 dict_items
)是可迭代的。
1 2 3 4 5
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic.keys()) print(dic.values()) for k, v in dic.items(): print(f'{k} 于 {v} 年诞生')
|
避免键不存在错误的方法 get() 和 setdefault()
在字典中访问不存在的键, 会触发KeyError
的异常错误。字典的get()
方法可以让我们放心地通过键取值,而不用if
语句进行判断。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic.get('C', 0)) print(dic.get('C#', 0))
|
还有一个类似的方法setdefault()
,该方法也可以根据键取值。不同的是,如果键不存在,这个键值对会被添加到字典中。
1
| setdefault(key, default=None)
|
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic.setdefault('C', 0)) print(dic.setdefault('C#', 0))
|
字典小实例:
setdefault()
方法是一个很好的快捷方式,可以确保一个键存在。下面有一个小程序,计算一个字符串中每个字符出现的次数。
1 2 3 4 5 6
| message = '我是小嗷犬,喜欢程序设计,也喜欢嗷嗷嗷。' count = {} for character in message: count.setdefault(character, 0) count[character] = count[character] + 1 print(count)
|
pop()、popitem() 和 clear() 方法
字典的pop()
方法用于通过键获取值,同时删除键值对。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic.pop('C')) print(dic)
|
字典的popitem()
方法获取的是随机的键值对。
注:在Python3.7之后,popitem()
返回最后插入的键值对(key, value 形式),按照 LIFO(Last In First Out 后进先出法) 顺序规则,即最末尾的键值对。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} print(dic.popitem('C')) print(dic)
|
字典的clear()
方法用于清除字典中所有的键值对。
1 2 3
| dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'Python':'1989'} dic.clear() print(dic)
|
字典的格式化字符串
如果数据存储在字典中,可以通过字典的键来指定占位符替换的值。这种方式更加清晰。
1 2
| dic = {'name':'C', 'time':'1972'} print('{name} 诞生于 {time} 年'.format(**dic))
|
字典嵌套
字典的值可以是任意类型。因此,可以在字典的值中嵌套列表、元组或者字典。
1 2
| dic = {'C':{'time':'1972'}, 'C++':{'time':'1979'}} print(dic['C']['time'])
|
字典推导式
与列表类似,字典也可以使用推导式来生成。字典推导式利用每次迭代收集表达式的键和值结果,并将该键值对添加到新的字典中。语法形式如下:
1
| {key_expression : value_expression for expression in iterable}
|
1 2 3 4
| name = ['C', 'C++', 'Java', 'Python'] time = ['1972', '1979', '1995', '1989'] dic = {n : t for n, t in zip(name, time)} print(dic)
|
字典推导式也可以加上 if 语句进行数据的过滤。
1
| {key_expression : value_expression for expression in iterable if condition}
|
1 2 3 4
| name = ['C', 'C++', 'Java', 'Python'] time = ['1972', '1979', '1995', '1989'] dic = {n : t for n, t in zip(name, time) if int(t) < 1990} print(dic)
|