Python 字典
本来我们来系统的学习什么是字典、创建字典、字典增加、字典修改、字典删除、字典查询、字典取键、字典取值、字典赋值、字典遍历、字典的深拷贝和浅拷贝、字典的常用方法,帮助大家系统学习Python字典的全部知识。
什么是字典?
本节我们来学习字典。那什么是字典呢?字典在Python 中是一个无序的数据值集合,这里有个关键字叫做无序。它由一系列键值对组成,每个键值对都是一个唯一的键和对应的值。字典可以通过键来访问其对应的值,类似于列表中通过索引来访问元素。字典的键必须是不可变的,而值可以是任何类型的对象。
前面我们学习的字符串、列表和元组,它们中的元素都是有顺序的,所以你可以对它们使用索引和切片,而字典它是无序的,那么我们为什么还需要使用字典呢?下面我们通过一个例子来更好的理解一下,在水浒传中一共有108将。
头把交椅就是呼保义宋江,第二把交椅是玉麒麟卢俊义......最后的两个是鼓上骚时迁和金毛犬段景住,那如果我们把这108个英雄好汉写入一个列表如下
heros = ['宋江','卢俊义','.....','时迁','段景柱']
heros[12] #鲁智深
heros[102] #孙二娘
那如果在这个列表中,我们要获取一些排名靠中间的,比如说要获取矮脚虎王英,一丈青扈三娘。这样的话你找起来就会非常的不方便,所以针对列表中元素较多的情况下,我们可以使用字典来更好的解决这类问题 。 你会发现在Python中,充分的利用了各种括号,小括号用来表示元组,中括号用来表示列表,而大括号用来表示我们这里的字典。
在字典中每一个元素都是由key和value组成的,它们中间使用了一个冒号。表示它们是配对关系,一个key对应着一个value。那如果有多个元素呢?多个元素就用逗号来分隔,这里的key翻译为中文就叫做键,而value呢,被翻译为值。键和值这种类型的组合,就叫做键值对,它们是1对1的关系。在这里你可以把Python中的字典和我们现实生活中的字典联系起来,这样可以方便你更好的理解。
现在我这里有一个在线版的新华字典,如果现在我想通过拼音来查找大熊课堂中的熊字,我应该这样操作,在这个输入框中我输入拼音熊 然后点击搜索,开始搜索汉字,它就会根据这个拼音熊,搜索到汉字熊。 这里的拼音就相当于key,而汉字就是value。 Python对这里的key和value有什么要求呢?key必须是不可变类型,也就是说它可以是数字,可以是字符串。
比如说这里的拼音熊,它就是一个字符串,甚至它还可以是一个元组,但是使用元组的情况非常少见,因为查找起来不方便。那么后面的value呢?这个value就可以是任何数据类型了,此外还需要注意的是这个value可以是多个元素,如上图, 说通过拼音熊,你还可以查找出 ,这里的熊、雄和兄。
创建字典
本节我们来学习创建字典,我们创建列表,元组基本相同,字典以键值对的形式存储数据,其中键必须是不可变的类型(如字符串、数字或元组),而值可以是任意类型的对象。
语法如下:
dict = {key1:value1, key2:value2, key3:value3, ...}
其中,key1:value1
是一个键值对,用冒号分隔,多个键值对之间用逗号分隔。
创建空字典的语法如下:
dict = {}
- 直接赋值
创建字典最简单的方法就是直接赋值。我们可以使用花括号()来创建一个空字典,然后使用键值对来添加元素。键值对之间使用冒号(:)分隔,每个键值对之间使用逗号(,)分隔。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
print(type(heros))
输出结果为:
<class 'dict'>
- 创建空字典
如果需要创建一个空字典,可以使用花括号来创建一个没有任何元素的字典。
empty_dict = dict()
print(type(empty_dict))
输出结果为:
<class 'dict'>
- 值是多个元素
在字典中,值可以是任何数据类型,包括数字、字符串、列表、元组等。如果值是多个元素,可以使用列表或元组来表示。比如说在水浒传中分为天罡星和地煞星,我们这样定义一个变量heros,键名可以设置为天罡星,在天罡星里有36个人物,你可以使用元组,也可以使用列表,甚至你还可以使用字典来表示 ,地煞星同理。
heros_star = {'天罡星':{'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深'},
'地煞星':{'母夜叉':'孙二娘'}}
- 获取字典中的值
如何从字典中取值呢?取值也是一样的,使用一个中括号就可以取值。比如说我要取这里的鲁智深的值,那么我可以这样操作 。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
print(heros['花和尚'])
输出结果:
鲁智深
这样我们通过键名我们可以取到键值。
那如果对于这种情况呢?在键值中包含着多个元素的,取值的方式也是一样的
heros_star = {'天罡星':{'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深'},
'地煞星':{'母夜叉':'孙二娘'}}
print(heros_star['天罡星']['花和尚'])
输出结果:
鲁智深
- 创建字典的时候,不要使用相同的键名
在创建字典的时候,不要使用相同的键名,我们举个例子,在水浒传中有一个真假李逵。真李逵的绰号叫黑旋风,它的值是李逵,还有一个假李逵呢,他也冒充黑旋风,他的值是李鬼。在这个字典中有相同的键名,黑旋风,黑旋风。那么看一下,当我们要取值的时候会发生什么情况?
dict_val = {'黑旋风':'李逵','黑旋风':'李鬼'}
print(dict_val['黑旋风'])
输出结果:
李鬼
结果它获取到了李鬼,而没有获取到前面的李逵,这是因为当你的字典中,如果键名相同的话,它会默认取最后一个,所以说小伙伴们在创建字典的时候,一定不要使用相同的键名。
- 键不同,键值相同
dict_val2 = {'及时雨':'宋江','呼保义':'宋江','忠义黑三郎':'宋江'}
print(dict_val2['及时雨'])
print(dict_val2['呼保义'])
print(dict_val2['忠义黑三郎'])
输出结果:
宋江
宋江
宋江
看到输出的结果都是宋江,也就是说在字典中键名是不能相同的,而键值是可以相同的。
下面我们来总结一下字典的特点 :
字典增加
本节我们来学习字典增加的方法,可以使用多种方法向字典中添加键值对。我们介绍二种常用方式:使用方括号和update。
- 使用方括号[]
方括号[]语法是Python中最常用的添加字典键值对的方法之一。它的语法非常简单,只需要使用字典的键作为索引,然后将要添加的值赋值给它即可。
语法:
dict[key] = value
实例1:方括号给字典增加值
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros['豹子头'] = '林冲'
print(heros)
运行结果:
{'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘', '豹子头': '林冲'}
2.使用update()方法
update()方法可以用于将一个字典中的键值对添加到另一个字典中。它的语法非常简单,只需要将要添加的键值对作为一个字典传递给update()方法即可。
语法:
dict.update({key: value})
实例2:使用update()方法给字典增加值
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
new_dict = {'豹子头': '林冲'}
heros.update(new_dict) # 使用update()方法向字典中添加键值对
print(heros)
运行结果:
{'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘', '豹子头': '林冲'}
字典修改
本节我们学习Python字典修改方法,包括修改键对应的值、新增键值对。
- 修改键对应的值
要修改字典中某个键对应的值,可以直接通过键访问字典,并将其对应的值赋值给一个新的变量。比如说这里及时雨宋江,我把他改为及时雨宋公明。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros['及时雨'] = '宋公明'
print(heros)
输出结果为:
{'及时雨': '宋公明', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
- 使用update方法对字典进行修改
语法:
dict.update({key: value})
其中,dict
是字典名称,key
是要新增的键,value
是对应的值。
如果你要被添加的字典中,包含着原来字典中的键名和键值、字典的键名但键值不同,不包含键名和键值,这时会怎样呢?假如说我在这里再添加一个
dict_val = {'及时雨':'宋江','入云龙':'公孙胜','花和尚':'鲁达'}
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
dict_val = {'及时雨':'宋江','入云龙':'公孙胜','花和尚':'鲁达'}
heros.update(dict_val)
print(heros)
输出结果为:
{'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁达', '母夜叉': '孙二娘', '入云龙': '公孙胜'}
通过结果我们可以得出具有相同的键名,那么后一个会覆盖前一个,鲁达在后面会覆盖原来的鲁智深,相同键名和键值不会添加进来。
字典删除
本节我们学习字典的删除,在 Python 字典中,有多种方法可以删除键值对或清空整个字典。本文将介绍四种方法:del、pop、popitem 和 clear。并给大家总结表格如下
方法 | 作用 | 示例 |
---|---|---|
del | 删除字典中指定的键值对 | my_dict = {'a':1, 'b':2} del my_dict['a'] |
pop | 删除字典中指定的键值对并返回该键对应的值 | my_dict = {'a':1, 'b':2} my_dict.pop('a') |
popitem | 随机删除 字典中的一个键值对并返回该键值对 | (假设字典中有键值对{'a':1, 'b':2}) my_dict.popitem() 返回值可能是('a', 1)或者('b', 2) |
clear | 清空字典中所有的键值对 | my_dict = {'a':1, 'b':2} my_dict.clear() |
- del 方法
del 方法可以删除字典中任意一个键值对,其语法如下:
del dict[key]
其中,dict 表示要删除键值对的字典,key 表示要删除的键。如果字典中不存在该键,则会报错。
实例1:删除一个元素
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
del heros['及时雨']
print(heros)
输出结果:
{'玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
在上面的例子中,我使用 del 方法删除了字典中的一个键值对'及时雨':'宋江' ,最后输出字典的内容。
实例2:删除整个字典
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
del heros
print(heros)
输出结果:
NameError: name 'heros' is not defined
这里提示我heros is not defined,那是因为我们已经把这个hero删除了,这个字典不存在了,所以你在打印的时候就会提示heros is not defined,这就说明你把整个字典删除成功了。
- pop 方法
pop 方法可以删除指定键的键值对,并返回该键对应的值。
语法如下:
dict.pop(key[, default])
dict 表示要删除键值对的字典,key 表示要删除的键。如果该键不存在,可以提供一个默认值 default,如果不提供则会报错。
实例3:pop方法根据键名删除
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros.pop('花和尚')
print(heros)
输出结果:
{'及时雨': '宋江', '玉麒麟': '卢俊义', '母夜叉': '孙二娘'}
那如果你删除的键名不存在呢?比如说我要删除和尚这个键名,在我们的字典中是不存在的,那么会产生怎样的结果呢?
这里就提示了错误KeyErrors,键名错误,因为这个和尚不存在,这种情况pop是无法删除的
3.popitem 方法
popitem 方法可以删除字典中删除最后一个键值对,并以元组(key, value)的形式返回被删除的键值对。
语法如下:
dict.popitem()
实例4:popitem 方法删除字典最后一个
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
item1 = heros.popitem()
item2 = heros.popitem()
print(item1)
print(item2)
print(heros)
输出结果:
('母夜叉', '孙二娘')
('花和尚', '鲁智深')
{'及时雨': '宋江', '玉麒麟': '卢俊义'}
- clear方法
clear 方法可以清空整个字典,其语法如下:
dict.clear()
该方法不需要任何参数,它会删除字典中的所有键值对,使字典变为空字典。
下面是一个实例:
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros.clear()
print(heros)
输出结果:
{}
使用 clear 方法清空了整个字典,最后输出字典的内容为空字典。
作业
作业一:使用 del 方法删除字典中的一个键值对,键为 'hobby',并输出删除后的字典。
dict1 = {'name': 'Andy', 'hobby': 'basketball', 'gender': 'male'}
- 使用 pop 方法删除字典中的一个键值对,键为 'hobby',并输出返回的值和删除后的字典。
dict1 = {'name': 'Andy', 'hobby': 'basketball', 'gender': 'male'}
- 使用 popitem 方法删除字典中的一个键值对,并输出返回的元组和删除后的字典。
dict1 = {'name': 'Andy', 'hobby': 'basketball', 'gender': 'male'}
- 使用 clear 方法清空字典,并输出清 空后的字典。
dict1 = {'name': 'Andy', 'hobby': 'basketball', 'gender': 'male'}
获得作业答案请联系本笔记的配套视频:Python零基础入门动画课【全集】
字典查询
本节我们来学习字典的查询,在字典中,我们可以使用get方法和in关键字进行查询,判断某个键是否在字典中存在。
- in语法
in语法用于判断一个键是否在字典中存在。
语法如下:
key in dict
其中,key表示需要查询的键的名称,dict表示需要查询的字典。如果该键存在于字典中,则返回True,否则返回False。
实例
实例1:判断键是否存在于字典中
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
if '及时雨' in heros:
print('该元素在字典中')
else:
print('该元素不在字典中')
输出结果为:
该元素在字典中
那假如说我不用键名,我用那个键值呢?这里有改为宋江,试一下根据值来查询。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
if '宋江' in heros:
print('该元素在字典中')
else:
print('该元素不在字典中')
输出结果为:
该元素不在字典中
该元素不在字典中,所以说小伙伴们需要注意的是,这里是根据键名,而不是键值来进行查找的。
实例2:判断键是否不存在于字典中
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
if '行者' not in heros:
print('该元素不在字典中')
else:
print('该元素在字典中')
输出结果为:
该元素不在字典中
- get查询方法
通过键来查询字典的值。
语法如下:
dict.get(key, default=None)
dict是要查询的字典,key是要查询的键值,default是可选参数,表示如果键不存在时返回的默认值。如果不提供默认值,则会返回None。
实例3:get方法查询字典的值
dict1 = {'name': 'andy', 'age': 18, 'gender': 'male'}
print(dict1.get('name')) # 根据键来查询值
print(dict1.get('height')) # 查询不存在的键,返回None
print(dict1.get('height', 170)) # 查询不存在的键,并提供默认值
输出结果:
andy
None
170
在上面的示例中,我们定义了一个字典dict1,然后使用get()方法来查询键name和键height对应的值。对于存在的键name,方法返回对应的值Alice;对于不存在的键height,方法返回None;对于不存在的键height,我们提供了一个默认值170,这时方法返回默认值。
字典取键
本节我们来介绍一下字典的常用操作取键,字典取键我们用keys方法,keys()方法获取所有键的列表。
语法
Python字典keys()方法的语法如下:
dict.keys()
dict表示字典对象,keys()表示调用字典对象的keys方法,返回值是一个包含字典中所有键的列表。
实例
实例1:keys()方法获取所有键的列表
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
keys = heros.keys()
print(keys)
输出结果为:
dict_keys(['及时雨', '玉麒麟', '花和尚', '母夜叉'])
结果返回的是一个dict_keys这个函数,函数里面有一个列表,我们能否直接从它取值呢?我们列表的方式来取值。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
keys = heros.keys()
print(keys)
print(keys[0]) #取值
输出结果为:
dict_keys(['及时雨', '玉麒麟', '花和尚', '母夜叉'])
TypeError: 'dict_keys' object is not subscriptable
这里就抛出了一个错误TypeError类型错误,说明它是不允许使用取值的,这里的dict keys,它是一个可迭代对象,可迭代对象的概念我们后面再来介绍,这里你只需要知道它不能够直接取值,那么如果要取值呢,可以把它转化 为列表,转化为列表以后,你就可以对它取值了。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
keys = heros.keys()
print(keys)
print(list(keys))
for key in keys:
print(key)
输出结果:
dict_keys(['及时雨', '玉麒麟', '花和尚', '母夜叉'])
['及时雨', '玉麒麟', '花和尚', '母夜叉']
及时雨
玉麒麟
花和尚
母夜叉
字典取值
在字典中取值时,有两种方法:使用[]符号和get()方法。下面分别介绍这两种方法的具体语法和参数:
- 使用[]符号
使用[]符号可以获取字典中指定键的值。
语法为:
字典名[键]
其中,字典名表示要获取值的字典名称,键表示要获取的键名。如果键名不存在,会抛出KeyError异常。
实例1:[]符号通过键获取值
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
print(heros['及时雨'])
print(heros['玉麒麟'])
print(heros['花和尚'])
输出结果:
宋江
卢俊义
鲁智深
- 使用values()方法获取所有值
values()方法返回字典中所有值的列表,返回的列表中的值是无序的。
语法如下:
dict.values()
实例2:使用value方法获取列表的值
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
values = heros.values()
print(values)
上述代码将输出:
dict_values(['宋江', '卢俊义', '鲁智深', '孙二娘'])
可以看到,values()方法返回了一个dict_values类型的列表,其中包含了字典中所有的值。它也是一个可迭代的对象,你不能够直接取值,可以通过转化为列表的方式来取值。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
values = heros.values()
print(list(values))
上述代码将输出:
['宋江', '卢俊义', '鲁智深', '孙二娘']
- 使用items()方法获取所有键值
items()方法是Python字典中的一个内置方法,用于返回一个包含字典所有(键,值)元组的列表。这个方法可以让我们在循环中同时访问字典的键和值,特别是在需要对字典进行迭代时,非常有用。
items()方法的语法如下:
dict.items()
dict是指定字典的名称。
items()方法不需要任何参数,它返回的是一个包含所有(键,值)元组的列表。这个列表中的每个元素都是一个元组,其中包含一个键和一个值。
实例3:使用items()方法获取所有键值对
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
items = heros.items()
print(items)
print(list(items))
输出结果:
dict_items([('及时雨', '宋江'), ('玉麒麟', '卢俊义'), ('花和尚', '鲁智深'), ('母夜叉', '孙二娘')])
[('及时雨', '宋江'), ('玉麒麟', '卢俊义'), ('花和尚', '鲁智深'), ('母夜叉', '孙二娘')]
通过items方法,我们可以获取字典中的键值对,结果仍然是一个可迭代对象,那么我要获取它的值呢,转化为列表,值得注意的是,列表中的每一个元素都是一个元组。
那假如说我要获取第1个及时雨宋江,取第1个元素0就获取到了及时雨宋江,这里就获取了一个元 组及时雨和宋江,在前面我们学习过元组的拆包,此时我们就可以使用元组的拆包来解决这个问题,第1个赋值为key,第2个赋值为value。
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
items = heros.items()
key,value = list(items)[0]
print(key)
print(value)
输出结果:
及时雨
宋江
字典复制
本节我们来介绍一下字典的常用操作复制,当我们需要在程序中对字典进行操作时,有时候需要对字典进行复制,以避免对原字典造成影响。本节将重点介绍字典复制方法copy()。
copy()方法语法如下:
new_dict = dict.copy()
dict代表要被复制的字典,new_dict代表复制后的新字典。copy()方法不接受任何参数。
实例
实例1:复制字典
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros_copy = heros.copy()
print("heros: ", heros)
print("heros_copy: ", heros_copy)
运行结果:
heros: {'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
heros_copy: {'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
实例2:修改复制后的字典
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','花和尚':'鲁智深','母夜叉':'孙二娘'}
heros_copy = heros.copy()
heros.pop('及时雨')
print("heros: ", heros)
print("heros_copy: ", heros_copy)
运行结果:
heros: {'玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
heros_copy: {'及时雨': '宋江', '玉麒麟': '卢俊义', '花和尚': '鲁智深', '母夜叉': '孙二娘'}
从结果中可以看出,修改原字典不会影响复制后的字典的内容。
例3:嵌套字典复制
dict1 = {'name': 'Andy', 'age': 18, 'info': {'gender': 'male', 'hobby': 'basketball'}}
dict2 = dict1.copy()
dict2['info']['hobby'] = 'football'
print("dict1: ", dict1)
print("dict2: ", dict2)
运行结果:
dict1: {'name': 'Andy', 'age': 18, 'info': {'gender': 'male', 'hobby': 'football'}}
dict2: {'name': 'Andy', 'age': 18, 'info': {'gender': 'male', 'hobby': 'football'}}
由于是字典嵌套,从结果中可以看出,这个实例是浅拷贝,后面小节我们在单独讲解深拷贝和浅拷贝。
字典遍历
本节我们来学习字典遍历,在处理字典数据时,常常需要对字典进行遍历操作。Python提供了4种字典遍历方式:遍历key、遍历value、遍历item以及同时遍历key和value。
- 遍历key
遍历字典的key可以使用for循环结合字典的keys()方法实现,
语法如下:
for key in dict.keys():
# 进行相应操作
其中,dict代表要遍历的字典对象,key表示当前遍历到的key值。
实例1:使用for循环遍历key
heros = {'及时雨':'宋江','玉麒麟':'卢俊义','