字典
字典的使用
在python中对字典进行了构造,让我们可以轻松的查到某个特定的键(类似拼音或笔画索引),从而通过键找到对应的值(类似具体某个字)。
创建和使用字典
字典的创建格式如下
a={key1:value1,key2:value2}
空字典的创建
b={}
注意:在创建字典的的时候键(key)必须唯一的,但值(value)不必。值可以取任何数据类型,键必须是不可变的,如字符串、数字或元组。
dict函数
dict函数 可以通过其他映射(如其他字典)或键/值序列对建立字典。
例如:
student=[(‘name‘,‘杜宇恒‘),(‘number‘,‘666‘)] detai=dict(student) print(‘学生详细信息:‘,detai) print(‘学生姓名:‘,detai[‘name‘]) print(‘学生学号:‘,detai[‘number‘])
C:\python\python.exe C:/python.py/zidian.py
学生详细信息: {‘name‘: ‘杜宇恒‘, ‘number‘: ‘666‘}
学生姓名: 杜宇恒
学生学号: 666
上例可以看到dict函数可以就爱那个序列转换为字典
dict函数还可以通过关键字创建字典。
例如:
detail = dict(name=‘杜宇恒‘,number=‘666‘) print(‘学生的详细信息:‘,detail)
C:\python\python.exe C:/python.py/zidian.py
学生的详细信息: {‘name‘: ‘杜宇恒‘, ‘number‘: ‘666‘}
通过关键字创建字典是dict函数非常有用的一个功能。
字典的基本操作
字典的基本操作在很多方面与序列(sequence)类似,支持删除修改等操作。
修改字典
向字典添加新内容的方法是是增加新键/值对,修改或删除已有键/值对,修改或删除已有键/值。
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘} #更新徐伟的学号 student[‘徐伟‘]=‘999‘ print(‘徐伟的学号是:%(徐伟)s‘%student) #添加一个新的学生 student[‘杜兆利‘]=‘1000‘ print(‘杜兆利的学号是:%(杜兆利)s‘%student) print(‘所有学生的信息:‘,student)
C:\python\python.exe C:/python.py/zidian.py
徐伟的学号是:999
杜兆利的学号是:1000
所有学生的信息: {‘杜兆利‘: ‘1000‘, ‘徐伟‘: ‘999‘, ‘杜宇恒‘: ‘666‘, ‘高爽‘: ‘888‘}
删除字典元素
此处的删除指的是显示删除,显示删除一个字典用del命令
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘删除之前:‘,student) #删除高爽 del student[‘高爽‘] print(‘删除之后:‘,student)
C:\python\python.exe C:/python.py/zidian.py
删除之前: {‘杜宇恒‘: ‘666‘, ‘杜兆利‘: ‘999‘, ‘高爽‘: ‘888‘, ‘徐伟‘: ‘777‘}
删除之后: {‘杜宇恒‘: ‘666‘, ‘杜兆利‘: ‘999‘, ‘徐伟‘: ‘777‘}
除了删除键还可以删除整个字典
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} del student print(‘删除整个字典之后:‘,student)
C:\python\python.exe C:/python.py/zidian.py
Traceback (most recent call last):
File "C:/python.py/zidian.py", line 8, in <module>
print(‘删除整个字典之后:‘,student)
NameError: name ‘student‘ is not defined
报错:student没有定义
由上例可以看出删除字典之后就不能字典进行访问了,执行del操作后字典就不存在了
字典键的特性
①键必须是不可遍的,可以用数字,字符串或元组充当,不能用列表
②字典值可以没有限制的取任何pytho对象,既可以是标准对象,也可以是用户自定义对象,但键不行。
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜宇恒‘:‘999‘} print(student)
C:\python\python.exe C:/python.py/zidian.py
{‘杜宇恒‘: ‘999‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}
一个键被赋值两次之后,后面的值会被记住
len函数
len函数用于计算字典元素的个数,即键的总数
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘字典中元素的个数为:%d个‘%len(student))
C:\python\python.exe C:/python.py/zidian.py
字典中元素的个数为:4个
type函数
type(variable)函数返回输入的变量类型,如果输入变量的是字典就返回字典
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘student的类型为:‘,type (student))
C:\python\python.exe C:/python.py/zidian.py
student的类型为: <class ‘dict‘>
字典的格式化字符串
字典的格式化方式是在每转换说明符中的%字符后加上圆括号括起来的键,在跟上其他说明元素。
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘徐伟的学号是:%(徐伟)s‘%student)
C:\python\python.exe C:/python.py/zidian.py
徐伟的学号是:777
字典的格式化除了增加字符串外,转换说明符还像以前一样工作。以这种方式使用字典时,只要给出的键都能在字典中找到,就可以获得任意数量的转换说明符
字典和列表的区别
字典(dict)的特点是:
查找和插入的速度极快,不会随着key的增加而变慢。
需要占用大量内存,内存浪费多。
列表(list)的特点是:
查找和插入时间随着元素的增加而增加。
占用空间小,浪费内存少
注意:dict内部存放的顺序和键放入的顺序是没有关系的。
字典方法
clera()方法
clera()方法用于删除字典内的所有项。
clera()方法语法如下:
dict.clear()
dict代表字典,不需要参数。该函数是一个原地操作(类似于list.sort)函数,没有任何返回值(返回值为None)
clera()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘student字典中的元素为:%d个‘%len(student)) student.clear() print(‘student字典删除元素后的个数为:%d个‘%len(student))
C:\python\python.exe C:/python.py/zidian.py
student字典中的元素为:4个
student字典删除元素后的个数为:0
字典调用clear方法后整个字典内所在的所有项都被删除。
copy方法
copy方法返回一个具有相同键/值对的新字典。这个方法是浅复制(shallow copy),因为值本身是相同的,而不是副本。
copy方法语法如下:
dict.copy()
dct代表字典,不需要参数。返回结果为一个字典的浅复制
copy方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} st=student.copy() print(‘复制后得到的st为:‘,st)
C:\python\python.exe C:/python.py/zidian.py
复制后得到的st为: {‘杜兆利‘: ‘999‘, ‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}
什么是浅复制?
示例:
student = {‘小智‘:‘1002‘,‘info‘:[‘小张‘,‘1006‘,‘man‘]} st=student.copy() st[‘小智‘] = ‘1005‘ print(‘更改copy后的st为:‘,st) print(‘原字符串为:‘,student) st[‘info‘].remove(‘man‘) print(‘删除后st为:‘,st) print(‘删除后student为:‘,student)
C:\python\python.exe C:/python.py/zidian.py
更改copy后的st为: {‘info‘: [‘小张‘, ‘1006‘, ‘man‘], ‘小智‘: ‘1005‘}
原字符串为: {‘info‘: [‘小张‘, ‘1006‘, ‘man‘], ‘小智‘: ‘1002‘}
删除后st为: {‘info‘: [‘小张‘, ‘1006‘], ‘小智‘: ‘1005‘}
删除后student为: {‘info‘: [‘小张‘, ‘1006‘], ‘小智‘: ‘1002‘}
从上例可以出,替换副本的值时原始字典不受影响。如果修改了某个值(原地修改,不是替换),原始字典就会改变,因为同样的值也原字典中以这样方式进行复制就是浅复制,使用深复制就可以避免该问题。
什么是深复制?
示例:
#深复制需要调用copy模块 import copy student = {‘小智‘:‘1002‘,‘info‘:[‘小张‘,‘1006‘,‘man‘]} st=copy.deepcopy(student) st[‘小智‘] = ‘1005‘ print(‘更改copy后的st为:‘,st) print(‘原字符串为:‘,student) st[‘info‘].remove(‘man‘) print(‘删除后st为:‘,st) print(‘删除后student为:‘,student)
C:\python\python.exe C:/python.py/zidian.py
更改copy后的st为: {‘小智‘: ‘1005‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}
原字符串为: {‘小智‘: ‘1002‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}
删除后st为: {‘小智‘: ‘1005‘, ‘info‘: [‘小张‘, ‘1006‘]}
删除后student为: {‘小智‘: ‘1002‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}
深复制,包含对象里面的自对象的复制,所以原始对象的改变不会造成深复制里任何子元素的改变
fromkeys()方法
fromkeys()方法用于创建一个新字典,以序列seq中的元素做字典的键,value为字典所有键对应的初始值
fromkeys()方法语法如下:
dict.fromkeys(seq[,value])
dict代表指定字典;eq代表字典键值列表;value代表可选参数,设置键序列(seq)。该方法返回结果为字典。
fromkeys()方法演示:
seq=(‘name‘,‘age‘,‘sex‘) info = dict.fromkeys(seq) print(‘新的字典为:%s‘% info) info =dict.fromkeys(seq,10) print(‘赋值后的字典为:%s‘%info)
C:\python\python.exe C:/python.py/zidian.py
新的字典为:{‘name‘: None, ‘sex‘: None, ‘age‘: None}
赋值后的字典为:{‘name‘: 10, ‘sex‘: 10, ‘age‘: 10}
fromkeys()方法使用给定位的键建立新字典,每个键默认对应的值为None。
get()方法
get()方法返回指定的键值,如果值不字典中,就返回默认值。
get()方法语法如下:
dict.get(key,default=None)
dict代表指定字典;key 代表字典中要查找的键,default代表指定键值不存在时默认值。该方法返回结果为指定的键值,如果值不在字典中,就返回默认值None。
get()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘高爽的学号为:%s‘% student.get(‘高爽‘)) #访问一个不存在的键值 print(‘柴兴旺的学号为:%s‘% student.get(‘柴兴旺‘))
C:\python\python.exe C:/python.py/zidian.py
高爽的学号为:888
柴兴旺的学号为:None
使用get方法访问一个不存在的键时,返回None。可以自定义默认值,用于替换None。
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} #访问一个不存在的 键值时将默认返回值None替换为自定的值 print(‘柴兴旺的学号为:%s‘% student.get(‘柴兴旺‘,‘此人不存在!!!‘))
C:\python\python.exe C:/python.py/zidian.py
柴兴旺的学号为:此人不存在!!
从上例可以看出‘此人不存在!!!‘代替了None
key in dict()方法
key in dict()方法python字典in操作符用于判断键是否存在于字典中,如果键在字典dict中就返回true,否则就返回false。
key in dict()方法语法如下:
key in dict
dict代表指定字典;key代表要在字典中查找的键。如果键在字典dict中就返回true,否则就返回false。
key in dict()方法演示: student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘} print(‘杜宇恒在student字典中吗?%s‘%(‘杜宇恒‘in student)) print(‘柴兴旺在student字典中吗?%s‘%(‘柴兴旺在‘in student))
C:\python\python.exe C:/python.py/zidian.py
杜宇恒在student字典中吗?True
柴兴旺在student字典中吗?False
注意:在python2中有一个相同功能的方法has_key方法,has_key方法的使用方式和in不同。
items()方法
items()方法以列表返回可遍历的(键,值)元组数组。
items()方法语法如下:
dict.items()
dict代表指定字典;不需要参数。返回结果为可遍历的(键/值)元组数组。
items()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} print(‘调用items方法的结果:%s‘%student.items())
C:\python\python.exe C:/python.py/zidian.py
调用items方法的结果:dict_items([(‘杜宇恒‘, ‘666‘), (‘徐伟‘, ‘777‘)])
上例可以看出返回结果为一个元组组数。
注意:在python2中提供了一个iteritems方法,和items方法的作用大致相同,但是iteritems方法返回的是一个迭代器对象,而不是列表。在python3没有iteritems方法
keys()方法
keys()方法以列表返回一个字典的所有键。
keys()方法语法如下;
dict.keys()
dict代表指定字典;不需要参数。返回结果为一个字典的所有键。
keys()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} print("student字典中的所有键为:%s"%student.keys())
C:\python\python.exe C:/python.py/zidian.py
student字典中的所有键为:dict_keys([‘杜宇恒‘, ‘徐伟‘])
上例可以看出返回的是一个元组数,数组中包含字典所有键。
setdefault()方法
setdefault()方法和get()方法类似,用于获得与给定键相关联的值。如果键不存在于字典中,就会添加键并将值设为默认值。
setdefault()方法语法如下:
dict.setdefault(key.default=None)
dict代表指定字典;key代表查找的键值,default代表不存在时设置的默认键值。该方法没有任何返回值。
setdefault()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘)) print(‘徐伟的键值为:%s‘%student.setdefault(‘徐伟‘)) print(‘student字典的型值为:%s‘%student)
C:\python\python.exe C:/python.py/zidian.py
高爽的键值为:None
徐伟的键值为:777
student字典的型值为:{‘徐伟‘: ‘777‘, ‘高爽‘: None, ‘杜宇恒‘: ‘666‘}
上例可以看出,当键不存在时,setdefault()方法返回默认值并更新字典;如果键存在就返回对应的值,不改变字典。
使用setdefault()访问一个不存在的键值时,如果不设定就使用None,如果设定就使用设定的值。
例如:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘))
C:\python\python.exe C:/python.py/zidian.py
高爽的键值为:None
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘,‘888‘)) print(student)
C:\python\python.exe C:/python.py/zidian.py
高爽的键值为:888
{‘高爽‘: ‘888‘, ‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘}
上列可以看出使用默认值时输出结果为None;设定了键值后便输出了所设定的键值,并且更新了字典。
update方法()方法
update方法()方法用于把字典dict2的键值/值对更新到dict里
update方法()方法语法如下:
dict.update(dict2)
dict代表指定字典;dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。
update方法()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘} student2={‘高爽‘:‘888‘} print(‘原student字典为:%s‘%student) student.update(student2) print(‘新student字典为:%s‘%student) #对相同项覆盖 student3={‘高爽‘:‘1010‘} student.update(student3) print(‘覆盖后的新student字典为:%s‘%student)
C:\python\python.exe C:/python.py/zidian.py
原student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘}
新student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}
覆盖后的新student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘1010‘}
由上例可以看出,提供的字典中的项被添加到旧字典中,如果有相同键就会覆盖。
values()方法
values()方法以列表形式返回字典中所有值,与返回键的列表不同,返回列表中可以包含重复的元素。
values()方法语法如下:
dict.values()
dict代表指定字典;不需要参数。返回结果为字典中的所有值。
values()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘666‘} print("student字典所有的值为:%s"%list(student.values()))
C:\python\python.exe C:/python.py/zidian.py
student字典所有的值为:[‘666‘, ‘666‘, ‘888‘]
上例可以看出,返回的列表中包含重复的元素。
本文出自 “duyuheng” 博客,谢绝转载!
原文地址:http://duyuheng.blog.51cto.com/12879147/1959686