Python3.5筆記
第五章 字典
什么是字典
字典是Python中唯一內(nèi)建的映射類(lèi)型,字典指定值沒(méi)有特定的順序,都儲(chǔ)存在一個(gè)特定的鍵(key)里,鍵可以是數(shù)字、字符串或者元組,值可以是任何類(lèi)型。
字典的創(chuàng)建和使用
字典由多個(gè)鍵及其對(duì)應(yīng)的值構(gòu)成的對(duì)組成(把鍵/值對(duì)稱(chēng)為項(xiàng))。字典的每個(gè)鍵/值(key/value)對(duì)用冒號(hào)(:)分割,每個(gè)項(xiàng)用逗號(hào)分割,整個(gè)字典包括在花括號(hào){}中??兆值溆蓛蓚€(gè)花括號(hào){}組成。語(yǔ)法格式如下:
map = {key1:value1,key2:value2,key3:value3...}
其中,鍵必須是唯一的,值不需要唯一。值可以是任意數(shù)據(jù)類(lèi)型,但鍵必須是不可變的,如:字符串、數(shù)字、元組。
實(shí)例:
dict1 = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print(dict1)
print(dict1['小智'])
輸出:
{'小智': 1001, '小明': 1002, '小強(qiáng)': 1003}
1001
通過(guò)dict()函數(shù)創(chuàng)建字典
可以用dict()函數(shù),通過(guò)其他映射(如其他字典)或鍵/值序列對(duì),建立字典。如:
student = [('小智','1001'),('小明','1002'),('小強(qiáng)','1003')]
detail = dict(student)
print(detail)
輸出:
{'小強(qiáng)': '1003', '小明': '1002', '小智': '1001'}
dict函數(shù)可以通過(guò)關(guān)鍵字參數(shù)創(chuàng)建字典。例如:
detail2 = dict(name='小智',number=1002)
print(detail2)
輸出:
{'number': 1002, 'name': '小智'}
字典的基本操作
修改、新增元素
向字典增加新內(nèi)容是增加新鍵/值對(duì),修改或刪除已有鍵/值對(duì)。如:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
student['小強(qiáng)'] = 'hello'
print(student)
student['小張'] = 1004
print(student)
輸出:
{'小明': 1002, '小智': 1001, '小強(qiáng)': 'hello'}
{'小張': 1004, '小明': 1002, '小智': 1001, '小強(qiáng)': 'hello'}
刪除字典中的元素、刪除字典
此處的刪除指的是顯示刪除,顯示刪除使用del命令,如:
del student['小智'] #刪除字典中的元素
print(student)
del student #刪除整個(gè)字典
print(student)
{'小強(qiáng)': 'hello', '小張': 1004, '小明': 1002}
Traceback (most recent call last):
File "D:/pyspace/hellopython/Chapter5.py", line 29, in <module>
print(student)
NameError: name 'student' is not defined
字典的特性
鍵不可以重復(fù)出現(xiàn)
鍵不可以重復(fù)出現(xiàn),鍵重復(fù)出現(xiàn)時(shí),只保留后面的值,如:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
print(student)
{'小強(qiáng)': 1003, '小智': 1005, '小明': 1002}
鍵必須是不可變的
鍵必須是不可變的,所以,可以用數(shù)字、字符串、元組,不可以用列表。
student = {['小智']:1001}
print(student)
輸出:
Traceback (most recent call last):
{'小智': 1001, '小明': 1002, '小強(qiáng)': 1003}
File "D:/pyspace/hellopython/Chapter5.py", line 36, in <module>
1001
student = {['小智']:1001}
--------------通過(guò)dict()函數(shù)創(chuàng)建字典----------------
TypeError: unhashable type: 'list'
#student = {['小智']:1001} #鍵必須是不可變的,不可以是列表
student = {('小智'):1001} #鍵必須是不可變的,可以是元組
print(student)
輸出:
{'小智': 1001}
len()函數(shù)
len()函數(shù)用于統(tǒng)計(jì)字典中元素的個(gè)數(shù)。語(yǔ)法格式如下:
len(dict)
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
print("student字典的長(zhǎng)度是%d" % len(student))
輸出:
student字典的長(zhǎng)度是3
type()函數(shù)
type()函數(shù)用于返回輸入的變量類(lèi)型,如果輸入的變量是字典,就返回字典類(lèi)型。語(yǔ)法格式如下:
type(var1)
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
print("student字典的類(lèi)型是%s" % type(student))
輸出:
student字典的類(lèi)型是<class 'dict'>
字典的格式化
字典的格式化方式是在,每個(gè)轉(zhuǎn)換說(shuō)明符號(hào)%后,加上用圓括號(hào)括起來(lái)的鍵。再跟上其他元素。如:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
print("student字典中小明的學(xué)號(hào)是%(小明)s" % student)
輸出:
student字典中小明的學(xué)號(hào)是1002
字典和list的區(qū)別
| 字典 | list |
|---|---|
| 查找和插入的速度極快,操作時(shí)間不會(huì)隨著key的增加而增加 | 查找和插入的時(shí)間,會(huì)隨著元素的增加而增加 |
| 需要占用大量的內(nèi)存,內(nèi)存浪費(fèi)多 | 占用空間少,浪費(fèi)內(nèi)存小 |
字典的方法
1、clear()方法
clear()方法用于清空字典中的所有元素,clear()方法沒(méi)有返回值,而是直接該表字典的值。語(yǔ)法格式如下:
dict.clear()
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
student.clear()
print("student字典中元素的個(gè)數(shù)是:%d" % len(student))
輸出:
student字典中元素的個(gè)數(shù)是:0
clear()方法和賦空值的區(qū)別
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
studentCopy = student
student.clear()#當(dāng)使用clear()方法時(shí),studentCopy的值也被清空了
print(student)
print(studentCopy)
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003,'小智':1005}
studentCopy = student
student = {}#當(dāng)通過(guò)空字典重新賦值時(shí),studentCopy的值沒(méi)有變化,還是指向原先的值
print(student)
print(studentCopy)
輸出:
{}
{}
{}
{'小明': 1002, '小強(qiáng)': 1003, '小智': 1005}
2、copy()方法
copy()方法返回一個(gè)具有相同鍵/值對(duì)的新字典。這個(gè)方法是淺復(fù)制,因?yàn)橹当旧硎窍嗤?,而不是副本。語(yǔ)法如下:
dict.copy()
返回值是一個(gè)字典的淺復(fù)制。
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
studentCopy = student.copy()
print("student字典copy的結(jié)果是:",studentCopy)
輸出:
student字典copy的結(jié)果是: {'小智': 1001, '小強(qiáng)': 1003, '小明': 1002}
什么是淺復(fù)制?
淺復(fù)制是指,復(fù)制后的副本和原來(lái)的對(duì)象,只是值相同,但是指向的是不同的對(duì)象,而不是同一個(gè)對(duì)象。所以改變A的值不會(huì)影響B(tài),同樣改變B的值,也不會(huì)影響A。如:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
studentCopy = student.copy()
print("student字典copy的結(jié)果是:",studentCopy)
studentCopy['小強(qiáng)']=2018
print("更新copy后的值:更新后的studentCopy是:",studentCopy)
print("更新copy后的值:student是:",student)
del studentCopy['小強(qiáng)']
print("刪除copy后的值:更新后的studentCopy是:",studentCopy)
print("刪除copy后的值:student是:",student)
student['小明'] = 3333
print("更新原始值:更新后的studentCopy是:",studentCopy)
print("更新原始值:student是:",student)
del student['小強(qiáng)']
print("刪除原始值:更新后的studentCopy是:",studentCopy)
print("刪除原始值:student是:",student)
輸出:
student字典copy的結(jié)果是: {'小智': 1001, '小強(qiáng)': 1003, '小明': 1002}
更新copy后的值:更新后的studentCopy是: {'小智': 1001, '小強(qiáng)': 2018, '小明': 1002}
更新copy后的值:student是: {'小智': 1001, '小強(qiáng)': 1003, '小明': 1002}
刪除copy后的值:更新后的studentCopy是: {'小智': 1001, '小明': 1002}
刪除copy后的值:student是: {'小智': 1001, '小強(qiáng)': 1003, '小明': 1002}
更新原始值:更新后的studentCopy是: {'小智': 1001, '小明': 1002}
更新原始值:student是: {'小智': 1001, '小強(qiáng)': 1003, '小明': 3333}
刪除原始值:更新后的studentCopy是: {'小智': 1001, '小明': 1002}
刪除原始值:student是: {'小智': 1001, '小明': 3333}
3、fromkeys()方法
fromkeys()方法用于創(chuàng)建一個(gè)新字典,以序列seq中的元素做為key,value為字典中所有元素對(duì)應(yīng)的初始值。格式如下:
dict.fromkeys(seq[,value])
其中,dict代表指定的字典,seq代表字典鍵值列表,value代表可選參數(shù),為鍵的值,如果不指定則為None,如果指定則給所有的key統(tǒng)一賦初值。
示例:
seq = ('name','age','sex')
print(dict.fromkeys(seq))
print(dict.fromkeys(seq,10))
輸出:
{'name': None, 'sex': None, 'age': None}
{'name': 10, 'sex': 10, 'age': 10}
4、get()方法
get()方法用于返回指定鍵的值,如果值不在字典中,則返回默認(rèn)值。語(yǔ)法如下:
dict.get(key,default=None)
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print("student中小智的學(xué)號(hào)是:%s" % student.get('小智'))
print("student中小智的學(xué)號(hào)是:%s" % student['小智'])#使用字典下標(biāo)取值
print("student中小張的學(xué)號(hào)是:%s" % student.get('小張','沒(méi)有這個(gè)人'))#get()方法取值不存在時(shí),不會(huì)報(bào)錯(cuò)
print("student中小張的學(xué)號(hào)是:%s" % student['小張'])#使用字典下標(biāo)取值不存在時(shí),會(huì)報(bào)錯(cuò)。
輸出:
student中小智的學(xué)號(hào)是:1001
student中小智的學(xué)號(hào)是:1001
student中小張的學(xué)號(hào)是:沒(méi)有這個(gè)人
print("student中小張的學(xué)號(hào)是:%s" % student['小張'])
{'小智': '1001', '小明': '1002', '小強(qiáng)': '1003'}
KeyError: '小張'
5、key in dict方法
Python字典in操作符用于判斷鍵是否存在于字典中,如果鍵在dict中就返回true,否則返回false。語(yǔ)法格式如下:
key in dict
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print("小智在字典中:%s" % ('小智' in student))#注意要用括號(hào)括起來(lái),否則輸出為false
輸出:
小智在字典中:True
6、items()方法
items()方法返回可遍歷的元素列表。語(yǔ)法格式如下:
dict.items()
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print(student.items())
輸出:
dict_items([('小明', 1002), ('小強(qiáng)', 1003), ('小智', 1001)])
7、keys()方法
keys()方法以列表返回一個(gè)字典所有鍵。語(yǔ)法格式如下:
dict.keys()
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print(student.keys())
輸出:
dict_keys(['小智', '小明', '小強(qiáng)'])
8、setdefault()方法
setdefault()方法,用于獲得與給定鍵相關(guān)聯(lián)的值。如果值在字典中不存在,就會(huì)添加鍵并將值設(shè)為默認(rèn)值。此方法沒(méi)有返回值。語(yǔ)法格式如下:
dict.setdefault(key,default=None)
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
print("student中小智的學(xué)號(hào)是:%s" % student.setdefault('小智'))
print("student中小智的學(xué)號(hào)是:%s" % student.setdefault('小智',2001))#key存在的話,返回key的值,不改變key對(duì)應(yīng)的值
#print("student中小張的學(xué)號(hào)是:%s" % student.setdefault('小張')) #如果不指定值,則默認(rèn)值為None
print("student中小張的學(xué)號(hào)是:%s" % student.setdefault('小張',1004)) #key不存在,存在指定值,則value=指定值
print("student中小張的學(xué)號(hào)是:%s" % student['小張'])
輸出:
student中小智的學(xué)號(hào)是:1001
student中小智的學(xué)號(hào)是:1001
student中小張的學(xué)號(hào)是:1004
student中小張的學(xué)號(hào)是:1004
9、update()方法
update()方法用于把字典dict2中鍵/值更新到指定dict里。語(yǔ)法格式如下:
dict.update(dict2)
示例:
student = {'小智':1001,'小明':1002,'小強(qiáng)':1003}
studentb = {'小張':1004,'小李':1005}
student.update(studentb)
studentc = {'小張':2001,'小李':2002}#相同的項(xiàng)會(huì)覆蓋
student.update(studentc)
print(student)
輸出
{'小智': 1001, '小張': 2001, '小強(qiáng)': 1003, '小明': 1002, '小李': 2002}
10、values()方法
values()方法以列表的形式返回字典中所有的值。與返回鍵的列表不同的是
習(xí)題
#用dict函數(shù)實(shí)現(xiàn)存儲(chǔ)一個(gè)人的姓名、手機(jī)號(hào)和地址信息
person = [('姓名','張三'),('手機(jī)號(hào)','13388886666'),('地址','火星')]
print(dict(person))
#創(chuàng)建一個(gè)字典,里面元素的鍵/值全部由字符串組成,然后更改某個(gè)元素,更改其
#值為非字符串形式
student = {'小智':'1001','小明':'1002','小強(qiáng)':'1003'}
# student['小智'] = 2018
student['小智'] = ['2018','世界杯']
print(student)
輸出:
{'姓名': '張三', '地址': '火星', '手機(jī)號(hào)': '13388886666'}
{'小強(qiáng)': '1003', '小智': ['2018', '世界杯'], '小明': '1002'}