目录
在列表和元组中,通常是使用索引来找到目标元素的。假如有如下两个列表,按顺序分别存放学生的姓名和学号:
Names = ['Li Hua', 'Julie', 'Zhang San']
School_number = ['202310000', '202310001', '202310002']
当我们想查到Julie的学号,就需要先在第一个列表找到Julie姓名的索引,然后在第二个列表用索引来查询她的学号:
print('Julie\'s school number is', School_number[Names.index('Julie')])
这里使用了.index()方法来查询Julie的索引,代码运行结果为:
但这样并不太方便,在大多数情况下我们更希望直接输入Julie就能查到她的学号信息,也就是通过特定的词来找到特定的元素,字典恰好满足这个要求。
创建字典
字典的创建格式为:
dict1 = {key1: value1, key2: value2, key3: value3}
dict2 = {} #空字典
字典由键(key)和其对应的值(value)组成,键与值之间用冒号( : )分隔;每一对键-值称为项,项之间用逗号分隔。整个字典用花括号{}包括在内。花括号内没有内容即为创建了一个空字典。
键必须是唯一的,而且必须是不可变的(比如字符串、数字、元组类型),如果出现重复的键,访问时后者会覆盖前者。
值可以不唯一,而且可以取任何数据类型。
dict1 = {'Time': '18:24', 123: [1, 2, 3], 'Afternoon': '18:24'}
print(dict1[123]) #输出结果为[1, 2, 3]
现在可以创建一个字典来取代刚刚储存姓名和学号的两个列表了,还可以达到通过直接访问名字来得到其学号信息:
database1 = {'Li Hua': '202310000', 'Julie': '202310001', 'Zhang San': '202310002'}
print(database1['Julie']) #输出为202310001
此外使用dict函数可以从其他映射或字典来创建字典:
data = [('Li Hua', '202310000'), ('Julie', '202310001')]
dict1 = dict(data)
字典的基本操作
访问字典
将相对应的键名放到字典后的方括号中即可访问:
Game = {'Mobagame': ['Dota', 'Lol'], 'FPSgame': 'Crossfire'}
print(Game['Mobagame']) #输出为['Dota', 'Lol']
如果不确定字典内是否有某种键元素可以使用in检查
print('Mobagame' in Game) #结果为True
修改和添加元素
通过以下方式对字典内的值进行修改:
dict1[key] = new_value
如果想增加新键-值对,也是相同的方法:
dict1[new_key] = new_value
示例代码:
Game = {'Mobagame': ['Dota', 'Lol'], 'FPSgame': 'Crossfire'}
Game['CRPGgame'] = 'Baldur\'s Gate 3' #增加键-值对
print(Game)
#输出为{'Mobagame': ['Dota', 'Lol'], 'FPSgame': 'Crossfire', 'CRPGgame': "Baldur's Gate 3"}
Game['FPSgame'] = 'CSGO' #修改键-值对
print(Game)
#输出为{'Mobagame': ['Dota', 'Lol'], 'FPSgame': 'CSGO', 'CRPGgame': "Baldur's Gate 3"}
删除/清空元素
使用del命令可以对字典内的键-值对进行删除:
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
del dict1['Lily'] #删除键Lily
print(dict1) #运行结果为{'Tom': 25, 'Chamber': 35}
使用del命令也可以对整个字典进行删除,但删除后整个字典将会消失,而不是变成空字典:
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
del dict1 #对整个字典进行删除
print(dict1) #会输出错误
使用.pop()方法可以删除指定项,想要将字典清空,可以使用.clear()方法。
具体操作在下方字典方法中。
字典方法
汇总目录
.keys() | 返回只包含字典键内容的字典视图 |
.values() | 返回只包含字典值内容的字典视图 |
.items() | 返回一个包含所有字典键-值对的列表 |
.get() | 返回一个包含所有字典键-值对的列表,没有对应的键则返回None |
.setdefault() | 查询字典内对应键的值,如果不存在会自动创建该键-值对 |
.copy() | 对字典进行浅复制,如果进行深复制要导入deepcopy模块 |
.pop() | 删除指定键和相对应的值,并返回对应的值 |
.popitem() | 删除字典最后一对键-值,并返回该键-值对 |
.clear() | 清空字典 |
.update() | 一个字典的项来更新另一个字典 |
.keys()
.keys()方法返回一个只包含字典键内容的字典视图:
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.keys()) #运行结果为dict_keys(['Tom', 'Lily', 'Chamber'])
.values()
.values()方法返回一个只包含字典值内容的字典视图:
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.values()) #运行结果为dict_values([25, 18, 35])
.items()
.items()方法返回一个包含所有字典键-值对的列表。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.items()) #运行结果为dict_items([('Tom', 25), ('Lily', 18), ('Chamber', 35)])
在一些老版本Python中该方法可能导致列表中的排列顺序不确定。
.get()
.get()方法可以查询指定键对应的值,如果没有对应的键则返回None。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.get('Tom')) #运行结果为25
print(dict1.get('Jerry')) #运行结果为None
使用该方法可以大胆地查询字典内的项,不需要担心会返回错误,因为即使不存在也会返回None。
.setdefault()
该方法也可以查询字典内对应键的值,但不同的是,当字典不包含该键/键-值时,会自动创建该键-值对。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.setdefault('Tom')) #运行结果为25
print(dict1.setdefault('Jerry')) #运行结果为None
print(dict1)
#运行结果为{'Tom': 25, 'Lily': 18, 'Chamber': 35, 'Jerry': None}
print(dict1.setdefault('Jeff', 22)) #运行结果为22
print(dict1)
#运行结果为{'Tom': 25, 'Lily': 18, 'Chamber': 35, 'Jerry': None, 'Jeff': 22}
如果只查询键且字典内不包含该键,返回None,并创建该项,值为None。如果查询键-值且字典内没有该键-值对,返回查询的值,并创建该项。
.copy()
对字典进行浅复制。
a = {'a': 123, 'b': [1, 2, 3], 'c':456}
b= a.copy()
b['a'] = 456
print(a) #运行结果为{'a': 123, 'b': [1, 2, 3], 'c': 456}
print(b) #运行结果为{'a': 456, 'b': [1, 2, 3], 'c': 456}
b['b'] = [1, 0, 0]
print(a) #运行结果为{'a': 456, 'b': [1, 0, 0], 'c': 456}
print(b) #运行结果为{'a': 456, 'b': [1, 0, 0], 'c': 456}
从示例可以看出,使用copy进行浅复制之后,对值进行替换,原件不会发生变化;如果是进行值的修改,原件将会随着变化。
如果想生成一个与原字典不相关联的副本,就要进行深复制。此时需要调用copy模块中的深复制函数deepcopy()。
from copy import deepcopy
a = {'a': 123, 'b': [1, 2, 3], 'c':456}
b = deepcopy(a)
b['b'] = [0, 0, 0]
print(a) #运行结果为{'a': 123, 'b': [1, 2, 3], 'c': 456}
print(b) #运行结果为{'a': 123, 'b': [0, 0, 0], 'c': 456}
.pop()
删除指定键和相对应的值,并返回对应的值。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.pop('Tom')) #返回值25
print(dict1) #运行结果为{'Lily': 18, 'Chamber': 35}
.pop()方法和在列表中功能相似,但不存在对应的.append()方法。
.popitem()
删除字典最后一对键-值,并返回该键-值对。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
print(dict1.popitem()) #返回('Chamber', 35)
print(dict1) #运行结果为{'Tom': 25, 'Lily': 18}
在一些老版本python中和.items()方法一样可能会导致删除顺序不确定。
.clear()
.clear()方法可以将字典清空。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
dict1.clear() #清空字典
print(dict1) #输出结果为{}
.update()
用一个字典的项来更新另一个字典。如果出现键相同的项就覆盖掉。
dict1 = {'Tom': 25, 'Lily': 18, 'Chamber': 35}
dict2 = {'Tom': 23, 'Jeff':30, 'Jerry': 15}
dict1.update(dict2)
print(dict1) #运行结果为{'Tom': 25, 'Lily': 18, 'Chamber': 35, 'Jeff': 30, 'Jerry': 15}