Python 中字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。
1 字典的创建
1.1 通过大括号 {} 创建字典。
由于字典中每个元素都包含两部分,分别是键(key)和值(value),因此在创建字典时,键和值之间使用冒号 : 分隔,相邻元素之间使用逗号 , 分隔,所有元素放在大括号 {} 中,格式为:
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
其中 dictname 表示字典变量名,keyn : valuen 表示各个元素的键值对;字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行,字典的值可以是 Python 支持的任意数据类型。
dict1 = {"年龄": 20, "姓名": "小明"}
print(type(dict1))
dict2 = {1: 20, 2: 30, 3: "六十"}
print(type(dict2))
dict3 = {1: (1, 2, 3), 2: [1, 2, 3], 3: "六十"}
print(type(dict3))
'''
<class 'dict'>
<class 'dict'>
<class 'dict'>
'''
1.2 通过 fromkeys 函数创建字典
Python 中,可以使用 dict 字典类型提供的 fromkeys 函数创建带有默认值的字典,语法格式为:
dictname = dict.fromkeys(list,value=None)
其中,list 参数表示字典中所有键的列表(list),value 参数表示默认值,如果不写,则为空值 None。
list1 = ["语文", "数学", "英语"]
dict1 = dict.fromkeys(list1)
print(dict1)
dict2 = dict.fromkeys(list1, 90)
print(dict2)
'''
{'语文': None, '数学': None, '英语': None}
{'语文': 90, '数学': 90, '英语': 90}
'''
1.3 通过 dict 函数创建字典
- 向 dict 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值:
demo1 = [('two', 2), ('one', 1), ('three', 3)]
demo2 = [['two', 2], ['one', 1], ['three', 3]]
print(dict(demo1))
print(dict(demo2))
'''
{'two': 2, 'one': 1, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
'''
- 通过应用 dict 函数和 zip 函数,可将两个列表、元组、集合、字符串,甚至还可以将 range
区间转换为对应的字典,语法格式为:dictname = dict(zip(keys, values) ):
keys1 = ["two", "one", "three"]
values1 = (2, 1, 3)
values2 = range(0, 3)
dict1 = dict(zip(keys1, values1))
dict2 = dict(zip(keys1, values2))
print(dict1)
print(dict2)
'''
{'two': 2, 'one': 1, 'three': 3}
{'two': 0, 'one': 1, 'three': 2}
'''
2 字典的访问
2.1 直接访问
因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。字典可以通过键来直接访问对应的值,语法格式为:dictname[key]
,其中,dictname 表示字典变量的名字,key 表示键名,注意,键必须是存在的,否则会抛出异常。
2.2 通过 get 函数访问
Python 更推荐使用 dict 类型提供的 get 函数来获取指定键对应的值。当指定的键不存在时,get 函数不会抛出异常,语法格式为:dictname.get(key_obj, defaultvalue)
,其中,dictname 表示字典变量的名字;key_obj 表示指定的键;defaultvalue 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
print(dict1["语文"])
print(dict1["物理"])
print(dict1.get("语文"))
print(dict1.get("物理"))
print(dict1.get("物理", "值不存在"))
'''
85
Traceback (most recent call last):
File "D:\code\pythonDev\test\main.py", line 3, in <module>
print(dict1["物理"])
KeyError: '物理'
'''
2.3 通过 setdefault 函数访问
Python 字典中 setdefault 函数可以使用指定的键返回项目的值,和 get 函数类似, 如果键不存在于字典中,将会添加键并将值设为默认,语法格式为:dictname.setdefault(key_obj, defaultvalue)
其中, dictname 表示字典名称,key_obj 表示目标键值对对应的键,defaultvalue 表示默认值(可以不写,不写的话是 None),当指定的 key_obj 不存在时,setdefault 函数会先为这个不存在的 key_obj 设置一个默认的 defaultvalue,然后再返回 defaultvalue,如果该 key_obj 存在,那么直接返回该 key_obj 对应的 value。
dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict1.setdefault("one"))
dict2 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict2.setdefault("one", 0))
dict3 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict3.setdefault("four"))
dict4 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
print(dict4.setdefault("four", 400))
print(dict4.get("four"))
'''
100
100
None
400
400
'''
2.4 字典中键值对的添加
为字典添加新的键值,直接给不存在的 key 赋值即可,语法格式为:
dictname[key_new] = value_new
其中,dictname 表示字典名称,key_new 表示新的键,value_new 表示新的值,只要是 Python 支持的数据类型都可以。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
dict1["物理"] = 86
print(dict1)
'''
{'语文': 85, '数学': 96, '英语': 92, '物理': 86}
'''
2.5 字典中键值对的修改
Python 字典中键(key)的名字不能被修改,只能修改值(value)。字典中各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,那么键所对应的值就会被新的值替换掉,以此达到修改元素值的目的。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
dict1["数学"] = 100
print(dict1)
# ==> {'语文': 85, '数学': 100, '英语': 92}
2.6 字典的删除和字典中键值对的删除
字典的删除:和删除列表、元组一样,手动删除字典也可以使用 del 语句,语法格式为:del dictname,其中,dictname 表示要删除的字典名称。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
del dict1
print(dict1)
'''
Traceback (most recent call last):
File "D:\code\pythonDev\test\main.py", line 3, in <module>
print(dict1)
NameError: name 'dict1' is not defined
'''
字典中键值对的删除:
- del 语句
如果要删除字典中的键值对,还是可以使用 del 语句,语法格式为:del dictname[key_obj],其中dictname 表示字典名称,key_obj 表示要删除的目标键值对的键名。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
del dict1["语文"]
print(dict1)
# ==> {'数学': 96, '英语': 92}
- pop 函数
pop 函数用来删除指定的键值对,语法格式为:dictname.pop(key_obj),其中,dictname 表示字典名,key_obj 表示字典中要删除的指定键值对的键名。
- popitem 函数
popitem 函数用来删除字典中最后一个键值对,语法格式为:dictname.popitem(),其中,dictname 表示字典名。
dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict1.pop("one")
print(dict1)
dict2 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict2.popitem()
print(dict2)
'''
{'two': 200, 'three': [100, 200, 300]}
{'one': 100, 'two': 200}
'''
2.7 判断字典中是否存在指定键值对
如果要判断字典中是否存在指定键值对,首先应判断字典中是否有对应的键。判断字典是否包含指定键值对的键,可以使用 in 或 not in 运算符,需要指出的是,对于 dict 而言,in 或 not in 运算符都是基于 key 来判断的,语法格式为:key_obj in dictname
,其中,key_obj 表示要查找的目标键值对的键名,dictname 表示字典名,如果存在,返回 True,如果不存在,返回 False。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
print("语文" in dict1)
print("物理" in dict1)
'''
True
False
'''
2.8 字典的遍历
- 通过 for 循环遍历
for 循环有两种方法可以遍历字典中的键值对,语法格式为:
# 第一种方法
for key in dictname:
print(key, dictname[key])
# 第二种方法
for key,value in dictname.items():
print(key, value)
其中,dictname 表示字典名,key 表示列表中键值对对应的键,value 表示列表中键值对对应的值。
dict1 = {'语文': 85, '数学': 96, '英语': 92}
for key in dict1:
print(key, dict1[key])
for key, value in dict1.items():
print(key, value)
'''
语文 85
数学 96
英语 92
'''
- 通过 keys 函数遍历
keys 函数用于返回字典中的所有键(key),语法格式为:dictname.keys()
- 通过 values 函数遍历
values 函数用于返回字典中所有键对应的值(value),语法格式为:dictname.values()
- 通过 items 函数遍历
items 函数用于返回字典中所有的键值对(key-value),语法格式为:dictname.items()
2.9 字典的复制(拷贝)
copy 函数返回一个字典的拷贝,也即返回一个具有相同键值对的新字典,语法格式为:dictname.copy()
a = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
b = a.copy()
print(b)
# ==> {'one': 100, 'two': 200, 'three': [100, 200, 300]}
注意,copy 函数所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy 函数只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {‘one’: 1, ‘two’: 2, ‘three’: []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [100, 200, 300] 的值不是自己独有,而是和 a 共有。
a = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
b = a.copy()
# 向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
a['four'] = 100
print(a)
print(b)
# 由于 b 和 a 共享[100,200,300](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(100)
print(a)
print(b)
'''
{'one': 100, 'two': 200, 'three': [100, 200, 300], 'four': 100}
{'one': 100, 'two': 200, 'three': [100, 200, 300]}
{'one': 100, 'two': 200, 'three': [200, 300], 'four': 100}
{'one': 100, 'two': 200, 'three': [200, 300]}
'''
2.10 字典的更新
update 函数可以使用一个字典所包含的键值对来更新己有的字典,在执行 update 函数时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去,语法格式为:dictname.update(dict_obj)
,其中,dict_obj 表示包含需要更新键值对的字典,dictname 表示需要被更新的字典。
dict1 = {'one': 100, 'two': 200, 'three': [100, 200, 300]}
dict2 = {'one': 100, 'two': 300, 'four': 400}
dict1.update(dict2)
print(dict1)
# ==> {'one': 100, 'two': 300, 'three': [100, 200, 300], 'four': 400}