Python列表、集合與字典(3)
目錄
- 一、列表
- 二、集合
- 三、字典
一、列表
1. 列表初識
??列表的使用為處理特定順序排列的數據提供了便利,列表元素可以是字母、數字或者其他信息,同時所加元素之間不存在任何關系。
??在Python中,用方括號表示列表,並用逗號分隔各個元素,具體如下所示:
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
nums = [1,2,3,4,5]
??上行代碼定義了一個names和nums的列表,列表長度(即列表包含元素數量)均為5個,其中names元素以字符形式(str型)表示,nums元素以數字形式(int型)表示。
2.列表訪問
??列表通過index訪問,即通過列表下表訪問列表元素,需要註意的是Python列表index和C語言一樣,都是從0開始而非1開始。
# 輸出列表元素和相應元素的下標
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
print(names[0])
print(names.index(‘ZhangYi‘))
>>> ZhangYi
>>> 0
3.列表操作
?&emsp實際使用中,創建列表是動態的,即我們依據需要對列表進行添加、修改、刪除等一系列操作,這樣將導致列表發生變化,下面將介紹列表主要的屬性或方法的操作。
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘] # 列表元素修改 names[0] = ‘GuanYu‘ print(‘1:\t‘,names) >>> 1: [‘GuanYu‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘] # 列表元素增添 names.append(‘BaiQi‘) print(‘2:\t‘,names) >>> 2: [‘GuanYu‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘, ‘BaiQi‘] # 列表元素刪除(remove del pop) names.remove(‘SunBin‘) print(‘3:\t‘,names) >>> 3: [‘GuanYu‘, ‘SuQin‘, ‘PangJuan‘, ‘LvBu‘, ‘BaiQi‘] del names[1] print(‘4:\t‘,names) >>> 4: [‘GuanYu‘, ‘PangJuan‘, ‘LvBu‘, ‘BaiQi‘] names.pop(1) print(‘\t‘,names.pop(1)) # 假如未指定下標,則默認刪除列表最後一個元素 print(‘5:\t‘,names) >>> ‘PangJuan‘ >>> 5: [‘GuanYu‘, ‘LvBu‘, ‘BaiQi‘] names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘,‘ZhangYi‘] # 列表元素下標 print(‘\t‘,names.index(‘ZhangYi‘)) print(‘6:\t‘,names[names.index(‘ZhangYi‘)]) >>> 0 >>> 6: ZhangYi # 列表元素統計 print(‘7:\t‘,names.count(‘ZhangYi‘)) >>> 7: 2 # 列表元素反轉 names.reverse() print(‘8:\t‘,names) >>> 8: [‘ZhangYi‘, ‘LvBu‘, ‘PangJuan‘, ‘SunBin‘, ‘SuQin‘, ‘ZhangYi‘] # 列表元素排序 # 排序順序:特殊字符->數字->字母->漢字 char_ = [‘#‘,‘12‘,‘Hello‘,‘$‘,‘54‘,‘霓虹‘,‘飛天‘] char_.sort() print(‘9:\t‘,char_) >>> 9: [‘#‘, ‘$‘, ‘12‘, ‘54‘, ‘Hello‘, ‘霓虹‘, ‘飛天‘] # 列表元素擴展 names.extend(char_) print(‘10:\t‘,names) print(‘11:"\t‘,names+char_) >>> 10: [‘ZhangYi‘, ‘LvBu‘, ‘PangJuan‘, ‘SunBin‘, ‘SuQin‘, ‘ZhangYi‘, ‘#‘, ‘$‘, ‘12‘, ‘54‘, ‘Hello‘, ‘霓虹‘, ‘飛天‘] >>> 11: [‘ZhangYi‘, ‘LvBu‘, ‘PangJuan‘, ‘SunBin‘, ‘SuQin‘, ‘ZhangYi‘, ‘#‘, ‘$‘, ‘12‘, ‘54‘, ‘Hello‘, ‘霓虹‘, ‘飛天‘] # 列表元素插入 names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘] names.insert(6,‘ZhaoYun‘) print(‘12:\t‘,names) >>> 12: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘, ‘ZhaoYun‘] names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘] char_ = [‘#‘,‘12‘,‘Hello‘,‘$‘,‘54‘,‘霓虹‘,‘飛天‘] names.insert(6,char_) print(‘13:\t‘,names) >>> 13: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘, [‘#‘, ‘12‘, ‘Hello‘, ‘$‘, ‘54‘, ‘霓虹‘, ‘飛天‘]] # 列表元素清空 names.clear() print(‘14:\t‘,names) >>> 14: []
??以上是關於列表元素的主要操作,並給出了相應的運算結果,此處只列舉常用的列表屬性或方法(除copy屬性外),其他的在此不再過多介紹。
??下面單獨進行列表copy屬性的介紹,此處涉及可能有些繁瑣,所以大家運行代碼時請註意區分相應的元素變化。
??首先是進行基本復制的介紹:
# copy()方法復制
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
print(names.copy())
>>> [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘]
# 數量復制
print(names*5)
>>> [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘, ‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘]
??接下來重點介紹下列表復制中的淺復制和深復制:
# 導入copy模塊
import copy
str_c = [‘ZhangFei‘,‘SunBin‘,‘PangTong‘,[‘孫臏‘,‘龐涓‘],‘LiBai‘]
print(‘orig:\t‘,str_c)
>>> orig: [‘ZhangFei‘, ‘SunBin‘, ‘PangTong‘, [‘孫臏‘, ‘龐涓‘], ‘LiBai‘]
# 以下orig簡稱為原本,copy版本簡稱為復制本
# 使用.copy()方法
# (1) 淺層(外層)列表原本元素修改,觀察復制本中相應元素
str_c_1 = copy.copy(str_c)
str_c[1] = ‘孫臏‘
print(‘cp_1:\t‘,str_c_1)
print(‘orig:\t‘,str_c)
>>> cp_1: [‘ZhangFei‘, ‘SunBin‘, ‘PangTong‘, [‘孫臏‘, ‘龐涓‘], ‘LiBai‘]
>>> orig: [‘ZhangFei‘, ‘孫臏‘, ‘PangTong‘, [‘孫臏‘, ‘龐涓‘], ‘LiBai‘]
# ***********************************************************************
# (1) 原本淺層列表元素變化後,復制本並未產生變化!相應修改復制本中的元素,相應原本中的元素也不會發生變化(此處不再驗證,有興趣可以自行驗證)
# ***********************************************************************
# 接續上次運行結果進行元素修改
# 使用.copy()方法
# (2) 深層(嵌套層)列表復制本元素修改,觀察原本中相應元素
str_c_1[3][0] = ‘SunBin‘
print(‘cp_1:\t‘,str_c_1)
print(‘orig:\t‘,str_c)
>>> cp_1: [‘ZhangFei‘, ‘SunBin‘, ‘PangTong‘, [‘SunBin‘, ‘龐涓‘], ‘LiBai‘]
>>> orig: [‘ZhangFei‘, ‘孫臏‘, ‘PangTong‘, [‘SunBin‘, ‘龐涓‘], ‘LiBai‘]
# ***********************************************************************
# (2) 復制本深層列表元素變化後,原本相應元素也產生變化!相應修改原本中的元素,相應復制本中的元素也不會發生變化(此處不再驗證,有興趣可以自行驗證)
# ***********************************************************************
# 接續上次運行結果進行元素修改
# 使用.deepcopy()方法
# (3) 淺層(外層)列表原本元素修改,觀察復制本中相應元素
str_c_2 = copy.deepcopy(str_c)
str_c[1] = ‘SunBin‘
print(‘cp_2:\t‘,str_c_2)
print(‘orig:\t‘,str_c)
>>> cp_2: [‘ZhangFei‘, ‘孫臏‘, ‘PangTong‘, [‘SunBin‘, ‘龐涓‘], ‘LiBai‘]
>>> orig: [‘ZhangFei‘, ‘SunBin‘, ‘PangTong‘, [‘SunBin‘, ‘龐涓‘], ‘LiBai‘]
# ***********************************************************************
# (3) 原本淺層列表元素變化後,復制本相應元素未產生變化!相應修改復制本中的元素,相應原本中的元素也不會發生變化(此處不再驗證,有興趣可以自行驗證)
# ***********************************************************************
# 接續上次運行結果進行元素修改
# 使用.deepcopy()方法
# (4) 深層(嵌套層)列表復制本元素修改,觀察原本中相應元素
str_c_2[3][0] = ‘孫臏‘
print(‘cp_2:\t‘,str_c_2)
print(‘orig:\t‘,str_c)
>>> cp_2: [‘ZhangFei‘, ‘孫臏‘, ‘PangTong‘, [‘孫臏‘, ‘龐涓‘], ‘LiBai‘]
>>> orig: [‘ZhangFei‘, ‘SunBin‘, ‘PangTong‘, [‘SunBin‘, ‘龐涓‘], ‘LiBai‘]
# ***********************************************************************
# (4) 復制本深層列表元素變化後,原本相應元素未產生變化!相應修改原本本中的元素,相應復制本中的元素也不會發生變化(此處不再驗證,有興趣可以自行驗證)
# ***********************************************************************
??在復制過程中存在淺復制(shallow copy)和深復制(deepcopy),這兩種復制的區別主要體現在對列表深層結構的復制,在淺層復制上兩者相同。通過上述試驗,我們能夠具體總結出:
- 當原本只存在一層結構(淺層結構)時,兩種復制方法不存在什麽差別,即不論復制本變化還是原本變化,都不影響對方內容;
- 當原本具有嵌套結構(深層結構)時,在淺層結構復制上,兩種復制方法變化機制和單一結構復制時的情況相同;
- 當進行原本深層結構復制時,利用淺復制時,無論原本或時復制本哪一方發生變化,對方對應的元素都將產生同樣的更改,而利用深復制時,在深層結構元素變化後,例如原本發生變化,則復制本相應元素不變化,相應的復制本變化,原本相應元素不變化。
??淺復制主要由以下集中形式,同時需要註意的是,利用淺復制和深復制時,需導入copy模塊:
import copy
a = copy.copy(b)
a = b[:]
a = list(b)
??列表除了上述方法和屬性外,還有一項很重要的內容就是切片功能,利用列表切片可能很方便的控制元素的輸出。
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
print(‘1:\t‘,names)
>>> 1: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘]
print(‘2:\t‘,names[1:4]) # names[1-3]
>>> 2: [‘SuQin‘, ‘SunBin‘, ‘PangJuan‘]
print(‘3:\t‘,names[-1]) # names[4]
>>> 3: LvBu
print(‘4:\t‘,names[-1:-3]) # names[]
>>> 4: []
print(‘5:\t‘,names[-3:-1]) # names[2-3]
>>> 5: [‘SunBin‘, ‘PangJuan‘]
print(‘6:\t‘,names[-2:-1]) # names[3]
>>> 6: [‘PangJuan‘]
print(‘7:\t‘,names[-1:]) # names[4]
>>> 7: [‘LvBu‘]
print(‘8:\t‘,names[-1:0]) # names[]
>>> 8: []
print(‘9:\t‘,names[:3]) # names[0-2]
>>> 9: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘]
print(‘10\t‘,names[0:-1]) # names[0-3]
>>> 10: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘]
print(‘11:\t‘,names[0:-1:2]) # names[0,2]
>>> 11: [‘ZhangYi‘, ‘SunBin‘]
print(‘12:\t‘,names[::2]) # names[0,2,4]
>>> 12: [‘ZhangYi‘, ‘SunBin‘, ‘LvBu‘]
print(‘13:\t‘,names[:]) # names[0-4]
>>> 13: [‘ZhangYi‘, ‘SuQin‘, ‘SunBin‘, ‘PangJuan‘, ‘LvBu‘]
??上述對列表的主要用法都進行了介紹,主要歸結有以下規律:
- names[a?:c:?i?] —— 對於列表names,在切片處理中,a表示切片元素起始下標,c為切片元素終止下標,i為切片切取步長,切取順序按照 names[a], names[a+i], names[a+2*i]……進行,其中names[c]為檢索的最大上限,即邊界,可以用集合中的開區間概念理解,即無法取到,只能取到names[c]之前的元素,另外 i 不寫情況下,默認取1。
- names[-1] —— 表示列表names列表的最後一個元素,相對應的names[-2]表示倒數第二個元素。
- names[:]——表示列表中的所有元素。
4.列表的循環
??上述操作主要針對列表元素進行處理專項處理,當列表元素數量較多,且需要對每個元素進行同質化操作時,列表所有元素挨個處理就顯得本笨拙了,因此列表循環在此刻就顯得十分有用。
??在使用過程中過程中,有兩種循環方式用的比較常見:
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
# 列表items循環,即列表元素循環
for name in names:
print(name)
>>> ZhangYi
SuQin
SunBin
PangJuan
LvBu
# 列表index循環,即列表下標循環
for index in range(len(names)):
print(names[index])
>>> ZhangYi
SuQin
SunBin
PangJuan
LvBu
??以上主要是針對淺層列表的循環繼續講解,至於深層列表,可以利用循環嵌套進行處理,在此不再多做贅述。另外再介紹下enumerate,它能夠同時返回列表元素的index和items,方便循環處理:
names = [‘ZhangYi‘,‘SuQin‘,‘SunBin‘,‘PangJuan‘,‘LvBu‘]
for index,items in enumerate(names):
print(index,items)
>>> 0 ZhangYi
1 SuQin
2 SunBin
3 PangJuan
4 LvBu
??列表主要內容基本就是上述這些,最後再講解點元組(tuple)類型,元組類型形式很簡單,就是元組元素用小括號括起來,與列表相比,元組只能進行元素下標和元素計數兩種方法的處理,其他方法對元組元素不適用,因為元組與列表不同,一旦創建便不可更改。
names = (‘ZhangFei‘,‘MaChao‘,‘GuanYu‘,‘ZhangFei‘)
# 元組元素循環
for name in names:
print(name)
>>> ZhangFei
MaChao
GuanYu
ZhangFei
# 元組列表循環
for i in range(len(names)):
print(names[i])
>>> ZhangFei
MaChao
GuanYu
ZhangFei
# 元組元素計數
print(names.count(‘ZhangFei‘))
>>> 2
二、集合
1.集合初識
??Python中的集合在意義上同數學上的集合意義相同,即集合元素具有唯一性,無序性。在Python中,集合定義不像 tuple()、list[]、dict{} 可以直接通過括號進行定類,在定義集合類型時可以利用函數 set() 進行定義,而集合輸出時則以大括號進行表示,具體如下所示:
set_0 = set(‘Hello‘)
set_1 = set([‘Hello‘])
set_2 = set({‘Hello‘})
print(‘0:\t{}\n{}\n{}‘.format(set_0,set_1,set_2))
>>> 0: {‘l‘, ‘H‘, ‘e‘, ‘o‘}
{‘Hello‘}
{‘Hello‘}
set_3 = set([‘1‘,‘2‘,‘3‘,‘4‘])
set_4 = set({‘1‘,‘2‘,‘3‘,‘4‘})
print(‘1:\t{}\n{}‘.format(set_3,set_4))
>>> 1: {‘2‘, ‘3‘, ‘1‘, ‘4‘}
{‘2‘, ‘3‘, ‘1‘, ‘4‘}
??通過上述代碼可以看出,利用集合表示字符串時:
- 使用小括號表示單個字符串時,集合將以每個字符作為集合元素表示;
- 使用中括號和大括號表示單個字符串時,集合將以整個字符串作為一個元素表示;
- 表示多個元素時,必須使用中括號或者大括號表示;
2.集合訪問
??集合不能像元組、列表那些可以通過指定下標訪問元素,因此集合訪問元素只能通過對元素進行遍歷:
set_ = set([‘1‘,‘2‘,‘3‘,‘4‘])
for index,items in enumerate(set_):
print(index,‘*‘+items+‘*‘)
>>> 0 *1*
1 *3*
2 *2*
3 *4*
3.集合操作
??數學意義上的集合有許多關系,在Python中,可以利用一些函數或者關系將這些關系表示出來:
# 交集
list_1 = set([1,2,3,4,5])
list_2 = set([1,2,8,9,12])
list_3 = set([1,2])
print(‘1:\t‘,list_1.intersection(list_2))
>>> 1: {1, 2}
print(‘2:\t‘,list_1.intersection(list_3))
>>> 2: {1, 2}
print(‘3:\t‘,list_1 & list_3)
>>> 3: {1, 2}
# 並集
print(‘4:\t‘,list_1.union(list_3))
>>> 4: {1, 2, 3, 4, 5}
print(‘5:\t‘,list_1 | list_3)
>>> 5: {1, 2, 3, 4, 5}
# 差集
print(‘6:\t‘,list_1.difference(list_3))
>>> 6: {3, 4, 5}
print(‘7:\t‘,list_1 - list_3)
>>> 7: {3, 4, 5}
# 子集
print(‘8:\t‘,list_1.issubset(list_2))
>>> 8: False
print(‘9:\t‘,list_3.issubset(list_1))
>>> 9: True
# 父集
print(‘10:\t‘,list_1.issuperset(list_2))
>>> 10: False
print(‘11:\t‘,list_1.issuperset(list_3))
>>> 11: True
# 子父集符號判斷
print(‘12:\t‘,list_3 in list_1)
>>> 12: False
print(‘13:\t‘,list_3 not in list_1)
>>> 13: True
print(‘14:\t‘,list_3 <= list_1)
>>> 14: True
print(‘15:\t‘,list_3 >= list_1)
>>> 15: False
# 對稱差集
print(‘16:\t‘,list_1.symmetric_difference(list_3))
>>> 16: {3, 4, 5}
print(‘17:\t‘,list_1 ^ list_3)
>>> 17: {3, 4, 5}
# 判斷交集
print(‘18:\t‘,list_1.isdisjoint(list_2))
>>> 18: False
??集合的邏輯關系基本就是上述這些,除了上述關系外,集合還有一些常用的操作方法:
list_1 = set([1,2,3,4,5])
# 集合元素添加
# 單項添加
list_1.add(212)
print(‘1:\t‘,list_1)
>>> 1: {1, 2, 3, 4, 5, 212}
# 多項添加
list_1.update([200,201,202])
print(‘2:\t‘,list_1)
>>> 2: {1, 2, 3, 4, 5, 200, 201, 202, 212}
# 集合元素刪除
list_1.remove(212)
print(‘3:\t‘,list_1)
>>> 3: {1, 2, 3, 4, 5, 200, 201, 202}
list_1.pop()
print(‘4:\t‘,list_1)
>>> 4: {2, 3, 4, 5, 200, 201, 202}
# discard()刪除時假如集合中沒有該元素,不報錯,返回None,
# 假如存在,則刪除,相對應的,remove則在沒有該元素時,會報錯
list_1.discard(5)
print(‘5:\t‘,list_1)
>>> 5: {2, 3, 4, 200, 201, 202}
# 集合長度
print(‘6:\t‘,len(list_1))
>>> 6: 6
三、字典
1.字典初識
??Python中,字典就是一系列的鍵-值對。每個鍵與一個值相關聯,通過鍵的使用可以訪問該鍵所對應的值,而值可以是Python中的任何對象,如數字、字符串、列表甚至是字典等。
MaChao = {‘Country‘:‘Shu‘,‘Gender‘:‘Male‘}
??如上所示,Python字典使用{ }包含元素,即字典一系列鍵-值對就放在字典打括號內,鍵和值使用冒號分隔,而鍵-值對之間使用都好分隔,字典內能夠存儲無限個鍵-值對。
2.字典訪問
??字典和列表兩種結構間共有著一種一一對應關系,即列表每個下標對應相應的元素,而字典通過鍵對應對應相應的值,列表通過下標訪問元素,字典則需要利用值所對應的鍵進行訪問。
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
print(info[‘Wu‘])
print(info[‘Shu‘])
>>> [‘LuXun‘, ‘TaiShici‘]
>>> ZhaoYun
3.字典操作
??字典的值操作也很簡單,找到所需修改值所對應的鍵,然後進行查找即可操作。
# 字典元素替換
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
info[‘Shu‘] = ‘GuanYu‘
print(info)
>>> {‘Shu‘: ‘GuanYu‘, ‘Wu‘: [‘LuXun‘, ‘TaiShici‘], ‘Wei‘: ‘DianWei‘}
# 字典元素刪除
del info[‘Wei‘]
print(‘del:\t‘,info)
info.pop(‘Shu‘)
print(‘pop:\t‘,info)
>>> del: {‘Shu‘: ‘GuanYu‘, ‘Wu‘: [‘LuXun‘, ‘TaiShici‘]}
>>> pop: {‘Wu‘: [‘LuXun‘, ‘TaiShici‘]}
# popitem()隨機返回並刪除字典中的一堆鍵—值
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
info_pop = info.popitem()
print(‘\t‘,info_pop)
print(‘popitem:\t‘,info)
>>> (‘Wei‘, ‘DianWei‘)
popitem: {‘Shu‘: ‘GuanYu‘, ‘Wu‘: [‘LuXun‘, ‘TaiShici‘]}
# 字典元素查找
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
print(info.get(‘Shu‘))
print(‘Shu‘ in info) # info.has_key(‘Shu‘) in py2.x
>>> ZhaoYun
True
# 字典元素更新-update()
# 字典更新時,假如新字典中有和原字典相同的鍵,則
# 新字典中該鍵的內容將完全替代原字典中該鍵所對應的值
# 假如沒有相同的鍵,則直接在原字典後進行新的添加
b = {
‘Shu‘:‘GuanYu‘,
‘Song‘:‘LiuYu‘
}
info.update(b)
print(info)
print(info.items())
>>> {‘Shu‘: ‘GuanYu‘, ‘Wu‘: [‘LuXun‘, ‘TaiShici‘], ‘Wei‘: ‘DianWei‘, ‘Song‘: ‘LiuYu‘}
dict_items([(‘Shu‘, ‘GuanYu‘), (‘Wu‘, [‘LuXun‘, ‘TaiShici‘]), (‘Wei‘, ‘DianWei‘), (‘Song‘, ‘LiuYu‘)])
# 字典元素更新-setdefault()
# setdefault()假如查找在字典裏查找到,則返回查找到的值,
# 假如沒有則創建新值,新值信息是setdefault()後面的信息
infos = {
‘三國‘:
{‘Shu‘:[‘ZhaoYun‘,‘GuanYu‘],
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:[‘DianWei‘,‘ZhangHe‘]
},
‘西晉‘:{
‘Sima‘:[‘SimaZhao‘,‘SimaYan‘]
},
‘東晉‘:{
‘Xie‘:[‘Xiean‘,‘Xiexuan‘]
}
}
infos[‘東晉‘][‘Xie‘][0] = ‘謝安‘
print(infos)
>>> {‘三國‘: {‘Shu‘: [‘ZhaoYun‘, ‘GuanYu‘], ‘Wu‘: [‘LuXun‘, ‘TaiShici‘], ‘Wei‘: [‘DianWei‘, ‘ZhangHe‘]}, ‘西晉‘: {‘Sima‘: [‘SimaZhao‘, ‘SimaYan‘]}, ‘東晉‘: {‘Xie‘: [‘謝安‘, ‘Xiexuan‘]}}
infos.setdefault(‘東晉‘,{‘Wang‘:[‘WangDao‘,‘WangRong‘]})
>>> {‘Xie‘: [‘Xiean‘, ‘Xiexuan‘]}
infos.setdefault(‘宋朝‘,{‘Liu‘:[‘LiuYu‘]})
>>> {‘Liu‘: [‘LiuYu‘]}
print(infos)
>>> {‘三國‘: {‘Shu‘: [‘ZhaoYun‘, ‘GuanYu‘], ‘Wu‘: [‘LuXun‘, ‘TaiShici‘], ‘Wei‘: [‘DianWei‘, ‘ZhangHe‘]}, ‘西晉‘: {‘Sima‘: [‘SimaZhao‘,‘SimaYan‘]}, ‘東晉‘: {‘Xie‘: [‘Xiean‘, ‘Xiexuan‘]}, ‘宋朝‘: {‘Liu‘: [‘LiuYu‘]}}
# 字典元素更新-fromkeys()
# fromkeys()在每個鍵(前面參數中的每個元素都是一個獨立的鍵)
# 後面都添加後面參數內的全部元素作為值,假如修改其中的一個值,
# 則字典中同樣位置的元素都將發生改變
ele = dict.fromkeys([6,7,8],[1,{‘Shu‘:‘ZhangFei‘},4])
print(ele)
>>> {6: [1, {‘Shu‘: ‘ZhangFei‘}, 4], 7: [1, {‘Shu‘: ‘ZhangFei‘}, 4], 8: [1, {‘Shu‘: ‘ZhangFei‘}, 4]}
ele[7][1][‘Shu‘] = ‘HuangZhong‘
print(ele)
>>> {6: [1, {‘Shu‘: ‘HuangZhong‘}, 4], 7: [1, {‘Shu‘: ‘HuangZhong‘}, 4], 8: [1, {‘Shu‘: ‘HuangZhong‘}, 4]}
4.字典循環
??字典結構相對來說比較復雜,因此在遍歷時,會和其他結構稍微有些不同。
(1)遍歷字典中的所有的鍵-值對
??遍歷鍵值對的遍歷有兩種方法,一種是常規的遍歷,另一種時運用字典特定的屬性方法遍歷:
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
# 常規遍歷方法
for i in info:
print(i + ‘:\t‘,info[i])
>>> Shu: ZhaoYun
Wu: [‘LuXun‘, ‘TaiShici‘]
Wei: DianWei
# itmes()遍歷
for key,value in info.items():
print(key + ‘:\t‘,value)
>>> Shu: ZhaoYun
Wu: [‘LuXun‘, ‘TaiShici‘]
Wei: DianWei
??需要註意的是,當數據量較小時,應用上述兩種方法都行,但是當數據量比較大時,使用items()會比較耗費CPU,而相比之下,第一種常規的遍歷方法更適合處理數量比較大時的情況。
(2)遍歷字典中的鍵/值
??前面有了對整個鍵-值對的遍歷,再對鍵進行遍歷就比較容易了:
info = {
‘Shu‘:‘ZhaoYun‘,
‘Wu‘:[‘LuXun‘,‘TaiShici‘],
‘Wei‘:‘DianWei‘
}
# 遍歷字典中的鍵
for key in info.keys():
print(key)
>>> Shu
Wu
Wei
# 遍歷字典中的值
for value in info.values():
print(value)
>>> ZhaoYun
>>> [‘LuXun‘, ‘TaiShici‘]
>>> DianWei
(3)遍歷字典中的所有值
??最後對字典嵌套循環進行簡要的介紹。
??很多情況下,字典並不是如我們上述所寫的這麽簡單,有時我們會遇到在字典中有多重嵌套的情況,而同時我們又需要將整個字典的所有值給打印出來,而面對多重嵌套,我們常常會抓耳撓腮,實際上,打印這些值,根本方法還是利用循環,下面將以一個兩重嵌套的字典進行所有制的打印說明,之後再遇到更多重的嵌套,原理都是一樣的,跳出代碼,掌握核心觀念,方可靈活運用。
infos = {
‘三國‘:
{‘蜀‘:[‘趙雲‘,‘關羽‘],
‘吳‘:[‘陸遜‘,‘甘寧‘],
‘魏‘:[‘典韋‘,‘張郃‘]
},
‘西晉‘:{‘司馬‘:[‘司馬炎‘,‘司馬昭‘]
},
‘東晉‘:{
‘謝‘:[‘謝安‘,‘謝玄‘]
}
}
# 以列表形式顯示值
for info in infos:
for info_inner in infos[info]:
print(info_inner + ‘:\t‘,infos[info][info_inner])
>>> 蜀: [‘趙雲‘, ‘關羽‘]
吳: [‘陸遜‘, ‘甘寧‘]
魏: [‘典韋‘, ‘張郃‘]
司馬: [‘司馬炎‘, ‘司馬昭‘]
謝: [‘謝安‘, ‘謝玄‘]
# 以單個元素顯示值
for info in infos:
for info_inner in infos[info]:
info_show = infos[info][info_inner]
for i in range(len(info_show)):
print(info + ‘--‘ + info_inner + ‘:\t‘,info_show[i])
>>> 三國--蜀: 趙雲
三國--蜀: 關羽
三國--吳: 陸遜
三國--吳: 甘寧
三國--魏: 典韋
三國--魏: 張郃
西晉--司馬: 司馬炎
西晉--司馬: 司馬昭
東晉--謝: 謝安
東晉--謝: 謝玄
Python列表、集合與字典(3)