Python基础教程2e–数据类型-dict(字典)

原文链接: http://www.juzicode.com/archives/314

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,看看会是什么结果?

计算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

读取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?

修改/添加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增加了一组’ 桔子’: ‘美味’的元素。

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 : {} 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注