原文链接: http://www.juzicode.com/archives/314
1 dict数据的定义
通过前面《Python基础教程2c—数据类型-List(列表)》和《Python基础教程2d—数据类型-Tuple(元组)》的学习,我们知道list和tuple分别是用中括号和小括号来定义的,用了“中”和“小”,是不是还少了个“大”,没错,Python中还有一种数据类型是用大括号来初始化的,我们来看下大括号定义一个变量,然后用type打印其类型,看下到底定义了一个什么类型的数据。
>>> d = {} >>> type(d) <class ‘dict’> >>> |
从打印信息看这是一种新的数据类型,名称叫做dict,也就是字典。定义一个空字典也可以用dict()来完成:
>>> d=dict() >>> type(d) <class ‘dict’> >>> |
dict的元素之间也和list和tuple一样,用逗号”,”分隔,它的单个元素中包含了一个key和一个value,key和value之间用冒号”:”分隔:变量 = {key1:value1, key2:value2, key3:value3}。看个实例:
>>> d={‘juzi’:10,’code’:20,’com’:30} >>> print(d) {‘juzi’: 10, ‘code’: 20, ‘com’: 30} >>> |
1.1 dict key类型
上面的例子中key的类型是字符串,这也是最常用的一种数据类型,因为字符串明确的意义可以使得代码的可读性更高。接下来我们试下int和float数据类型的key值:
>>> d1={1:10,2:20,3:30} >>> print(d1){1: 10, 2: 20, 3: 30} >>> d2={1.1:10,2.2:20, 3.3:30} >>> print(d2){1.1: 10, 2.2: 20, 3.3: 30} >>> |
现在看起来一切尚好,我们再来试下用list和tuple作为key,看看会发生什么:
>>> tuple1 = (1,2,3) >>> tuple2 = (4,5,6) >>> d3 = {tuple1:10,tuple2:20} >>> print(d3){(1, 2, 3): 10, (4, 5, 6): 20} # 用tuple作为dict的key时,是没有问题的 >>> list1 = [1,2,3] >>> list2 = [4,5,6] >>> d4 = {list1:10, list2:20} Traceback (most recent call last): File “<stdin>”, line 1, in <module> TypeError: unhashable type: ‘list’ # 这里提示list的类型是unhashable 类型的数据,所以出现了TypeError |
【实验】试试先定义一个dict类型的变量a,再用这个变量a作为另外一个字典d的key值,看看会是什么结果?
1.2 dict value类型
学习了dict的key值可以使用的数据类型,我们看下dict的value可以用什么数据类型:
源码 | print(‘—–欢迎来到www.juzicode.com’) print(‘—–公众号: juzicode/桔子code\n’) print(‘dict vuale类型实验:’) print(‘value为str类型’) d={‘j’:’orange’,’u’:’apple’,’z’:’lemon’,’i’:’banana’} print(d) print(‘value为int类型’) d1={‘j’:10,’u’:20,’z’:30,’i’:40} print(d1) print(‘value为float类型’) d2={‘j’:1.1,’u’:2.2,’z’:3.3,’i’:4.4} print(d2) print(‘value为tuple类型’) tuple1 = (1,2,3) tuple2 = (4,5,6) d3 = {‘j’:tuple1,’u’:tuple2} print(d3) print(‘value为list类型’) list1 = [1,2,3] list2 = [4,5,6] d4 = {‘j’:list1, ‘u’:list2} print(d4) |
结果 | —–欢迎来到www.juzicode.com —–公众号: juzicode/桔子code dict vuale类型实验: value为str类型 {‘j’: ‘orange’, ‘u’: ‘apple’, ‘z’: ‘lemon’, ‘i’: ‘banana’} value为int类型 {‘j’: 10, ‘u’: 20, ‘z’: 30, ‘i’: 40} value为float类型 {‘j’: 1.1, ‘u’: 2.2, ‘z’: 3.3, ‘i’: 4.4} value为tuple类型 {‘j’: (1, 2, 3), ‘u’: (4, 5, 6)} value为list类型 {‘j’: [1, 2, 3], ‘u’: [4, 5, 6]} |
从上面的实验看出value可以使用number,string,tuple,list等数据类型,来者不拒,颇有一种“万能容器”的感觉。
【实验】试试先定义一个dict类型的变量a,再用这个变量a作为另外一个字典d的value,看看会是什么结果?
2 计算dict长度
计算dict包含的元素个数,使用的函数仍然是len(),和计算字符串、列表和元组长度的函数是一样的。
源码 | print(‘dict len()函数实验:’) d={‘juzi’:10,’code’:’orange’,’com’:(1,2,3)} print(‘d:’,d) print(‘d长度’,len(d)) |
结果 | dict len()函数实验: d: {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} d长度 3 |
3 读取dict元素
我们知道string,list和tuple是一种有序储存的数据类型,可以像字符串那样根据下标索引查找元素,dict是否也可以像它们一样用下表来索引呢,先来做个实验,先定义一个字典d={‘juzi’:10,’code’:’orange’,’com’:(1,2,3)},包含了3个元素,试图用d[0]访问’juzi’:10这个元素:
抛异常了!提示KeyError,key为0的值是错误的,说明在字典里访问字典元素时,中括号里应该要用key值,而不是用下标值。正确的做法应该是下面这样的:
源码 | print(‘dict 读取元素实验:’) d={‘juzi’:10,’code’:’orange’,’com’:(1,2,3)} print(‘d:’,d) print(‘d[\’juzi\’]:’,d[‘juzi’]) print(‘d[\’code\’]:’,d[‘code’]) print(‘d[\’com\’] :’,d[‘com’]) |
结果 | dict 读取元素实验: d: {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} d[‘juzi’]: 10 d[‘code’]: orange d[‘com’] : (1, 2, 3) |
【实验】思考一下,在什么情况下,可以使用d[0],d[1],d[2]这样的形式访问dict?
4 修改/添加dict的值
从上一节看出读取dict某个元素的值要用到key,同样修改某个元素也用到key值,修改的方法:dict名称[key]=修改后的值,这种方法不需要考虑dict是否包含key,如果没有该key对应的元素,则会自动添加该元素。
源码 | print(‘dict 修改元素实验:’) d={‘juzi’:10,’code’:’orange’,’com’:(1,2,3)} print(‘修改前的d:’,d) d[‘juzi’] = ‘桔子code’ d[‘code’] = ‘apple’ d[‘com’] = 20 d[‘桔子’] = ‘美味’ print(‘修改后的d:’,d) |
结果 | dict 修改元素实验: 修改前的d: {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} 修改后的d: {‘juzi’: ‘桔子code’, ‘code’: ‘apple’, ‘com’: 20, ‘ 桔子’: ‘美味’} |
从上面的实验看,修改后vlaue的类型是可以和原来使用的类型是不一样的。另外’桔子’这个key值原来是不在d中的,d[‘桔子’] = ‘美味’后该dict增加了一组’ 桔子’: ‘美味’的元素。
5 dict内置的方法/函数
方法/函数 | 含义 |
dict.keys() | 返回字典所有的key组成的dict_keys,一种类似list的数据类型,但是不是list |
dict.values() | 返回字典所有的value组成的dict_values |
dict.items() | 返回字典中所有key:value组成的dict_items |
dict.get(key,default=None) | 返回key对应的value值,如果key不在字典中,返回default值,不指定default时返回None |
dict.setdefault(key,default=None) | 如果key不在字典中,将key:default追加到字典中,如果key存在则不更新 |
dict.update(dict2) | 把字典dict2的元素增加到dict里,类似list的extend |
pop(key) | 删除字典给定键 key 所对应的元素,key必须存在否则抛keyerror异常 |
dict.clear() | 清空字典 |
示例程序:
源码 | print(‘—–欢迎来到www.juzicode.com’) print(‘—–公众号: juzicode/桔子code\n’) print(‘dict 内置方法/函数实验:’) d={‘juzi’:10,’code’:’orange’,’com’:(1,2,3)} print(‘d :’,d) print(‘d.keys() : ‘,d.keys()) print(‘d.keys()类型 : ‘,type(d.keys())) print(‘d.values() : ‘,d.values()) print(‘d.values()类型: ‘,type(d.values())) print(‘d.items() :’,d.items()) print(‘d.items()类型: ‘,type(d.items())) print(‘d中 key=juzi 的value :’,d.get(‘juzi’)) print(‘d中 key=桔子 的value :’,d.get(‘桔子’)) d.setdefault(‘juzi’,20)d.setdefault(‘桔子’,20) print(‘d.setdefault() :’,d) d.pop(‘桔子’) print(‘d.pop(桔子)后 :’,d) #d.pop(‘香蕉’) #print(‘d.pop(香蕉)后 :’,d) d2={‘a’:1} print(‘d2 :’,d2) d2.update(d) print(‘d2.update(d), d2: ‘,d2) d.clear() print(‘d.clear()清空后的d :’,d) |
结果 | —–欢迎来到www.juzicode.com —–公众号: juzicode/桔子code dict 内置方法/函数实验: d : {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} d.keys() : dict_keys([‘juzi’, ‘code’, ‘com’]) d.keys()类型 : <class ‘dict_keys’> d.values() : dict_values([10, ‘orange’, (1, 2, 3)]) d.values()类型: <class ‘dict_values’> d.items() : dict_items([(‘juzi’, 10), (‘code’, ‘orange’), (‘com’, (1, 2, 3))]) d.items()类型: <class ‘dict_items’> d中 key=juzi 的value : 10 d中 key=桔子 的value : None d.setdefault() : {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3), ‘桔子’: 20} d.pop(桔子)后 : {‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} d2 : {‘a’: 1} d2.update(d), d2: {‘a’: 1, ‘juzi’: 10, ‘code’: ‘orange’, ‘com’: (1, 2, 3)} d.clear()清空后的d : {} |