本文為純知識點,預計需閱讀二十分鐘
資料結構基本上就是——它們是可以處理一些 資料 的 結構 。或者說,它們是用來存儲一組相關資料的。
在Python中有四種内建的資料結構——清單、元組和字典,集合。我們将會學習如何使用它們,以及它們如何使程式設計變得簡單,上一篇我們學完了清單和元組,今天來學習字典和集合
字典類似于你通過聯系人名字查找位址和聯系人詳細情況的位址簿,即,我們把鍵(名字)和值(詳細情況)聯系在一起。注意,鍵必須是唯一的,就像如果有兩個人恰巧同名的話,你無法找到正确的資訊。
注意,你隻能使用不可變的對象(比如字元串)來作為字典的鍵,但是你可以把不可變或可變的對象作為字典的值。
基本說來就是,你應該隻使用簡單的對象作為鍵。
鍵值對在字典中以這樣的方式标記:d = {key1 : value1, key2 : value2 }。
注意它們的鍵/值對用冒号分割,而各個對用逗号分割,所有這些都包括在花括号中
dict
key(鍵)必須是不可變資料類型,可哈希
value(值)任意資料類型
dict 優點:二分查找去查詢
存儲大量的關系型資料
特點:<=3.5版本無序,3.6以後都是有序
1.字典— 增
dic['鍵'] = 值
dic1 = {'age':18,'name':'xc','sex':'female'}dic1['height'] = 165print(dic1) # 沒有鍵值對,增加# {'age': 18, 'name': 'xc', 'sex': 'female', 'height': 165}dic1['age'] = 21print(dic1) #有鍵值對,則修改#{'age': 21, 'name': 'xc', 'sex': 'female', 'height': 165}
setdefault 設定預設
# dic1 = {'age':18,'name':'xc','sex':'female'}dic1.setdefault('weight',120)print(dic1) # 沒有鍵值對,增加# {'age': 18, 'name': 'xc', 'sex': 'female', 'weight': 120}dic1.setdefault('name','aa')print(dic1) #有鍵值對,不做任何操作# {'age': 18, 'name': 'xc', 'sex': 'female', 'weight': 120}
2. 字典—— 删
删除優先使用pop(有傳回值,要删除的内容不存在時不報錯),而不是del
pop 删除
dic1 = {'age':18,'name':'xc','sex':'female'}print(dic1.pop('age')) #有age直接删除---有傳回值,按鍵删除print(dic1) #18 {'name': 'xc', 'sex': 'female'}print(dic1.pop('erge','沒有此鍵/None')) #沒有erge----可設定傳回值:沒有此鍵/None print(dic1) #沒有此鍵/None {'name': 'xc', 'sex': 'female'}
popitem 随機删除
dic1 = {'age':18,'name':'xc','sex':'female'}print(dic1.popitem()) #('sex', 'female')#随機删除:有傳回值-----傳回元祖:删除的鍵值
clear 清空
dic1 = {'age':18,'name':'xc','sex':'female'}dic1.clear() #清空字典print(dic1) #{}
del 删除
dic1 = {'age':18,'name':'xc','sex':'female'}del dic1['name'] # 有,則删除# del dic1['name1'] #沒有,則報錯print(dic1) #{'age': 18, 'sex': 'female'}
3. 字典—— 改
update
dic = {'age':18,'name':'xc','sex':'female'}dic2 = {'name':'alex','weight':'168'}dic2.update(dic) #有則更新覆寫,沒有則增加print(dic) #{'age': 18, 'name': 'xc', 'sex': 'female'}print(dic2) #{'name': 'xc', 'weight': '168', 'age': 18, 'sex': 'female'}
4. 字典——查
keys,values,items
dic1 = {'age':18,'name':'xc','sex':'female'}print(dic1.keys(),type(dic1.keys())) #鍵 dict_keys(['age', 'name', 'sex']) print(dic1.values()) #值 dict_values([18, 'xc', 'female'])print(dic1.items()) #元祖 dict_items([('age', 18), ('name', 'xc'), ('sex', 'female')])
得到鍵值,首選get
print(dic1['name']) #有則列印#print(dic1['name1']) #沒有則報錯print(dic1.get('name')) #有name直接輸出---有傳回值print(dic1.get('name1','沒有此鍵')) #沒有name1----可設定傳回值:沒有此鍵/None
循環輸出
for i in dic1: print(i) #循環列印鍵(預設為鍵) for i in dic1.keys(): print(i) #循環列印鍵 for i in dic1.values(): print(i) #循環列印值 for i in dic1.items(): print(i) #循環列印鍵值對for k,v in dic1.items(): print(k,v) #列印鍵和值
5. 字典的嵌套
dic = { 'name':['alex','wusir','xinchen'], 'py9':{ 'time':'1213', 'study_fee':19800, 'addr':'CBD', }, 'age':21}
dic['age'] = 56 # 找到age,再更新為56print(dic)dic['name'].append('rt') #找到name,在添加名字print(dic)dic['name'][1] = dic['name'][1].upper() #找到name,再把wusir變為大寫print(dic)dic['py9']['female'] = 6 #找到元祖,增加鍵值對female:6print(dic)
應用執行個體:
#輸入一串字元,遇到字母,轉換為‘_’,并列印輸出
info = input('請輸入:')for i in info: if i.isalpha(): info = info.replace(i,'_')print(info)
四、集合
集合 類似于清單,但每個元素都必須是獨一無二且不可變的:
它是無序的
基本操作
print(set1) #{1, 2, 3}set2 = {1,2,3,[2,3],{'name':'xc'}} #清單是可變的(不可哈希),是以出錯print(set2) #TypeError: unhashable type: 'list'
1. 集合——增
add
set1 = {'alex','wusir','ritian','egon','barry'}# (1)add #因為集合是無序的,是以每次運作結果不一定一樣,增加的位置也不一定一樣set1.add('nvshen') #{'ritian', 'nvshen', 'egon', 'wusir', 'alex', 'barry'}print(set1)
update
set1.update('xc') #疊代添加,依然是無序的print(set1) #{'egon', 'x', 'wusir', 'nvshen', 'c', 'alex', 'ritian', 'barry'}
2. 集合——删
set1 = {'alex','wusir','ritian','egon','barry'}
pop--随機删除
print(set1.pop()) #egon:有傳回值,傳回本次删除的内容print(set1) #{'barry', 'alex', 'wusir', 'ritian'}
remove——指定元素删除
set1.remove('alex')print(set1) #{'egon', 'wusir', 'barry', 'ritian'}
clear——清空
set1.clear()print(set1) #空集合:set()
del
del set1 #删除之後集合不存在,報錯print(set1) #NameError: name 'set1' is not defined
3.集合不能改
集合是無序;
集合中的元素是不可變資料類型
4. 集合——查
set1 = {'alex','wusir','ritian','egon','barry'}for i in set1: print(i)
5. 集合之間的操作
set1 = {1,2,3,4,5}set2 = {4,5,6,7,8}
交集
print(set1 & set2) #(1) {4, 5}print(set1.intersection(set2)) #(2) {4, 5}
并集
print(set1 | set2) #(1) {1, 2, 3, 4, 5, 6, 7, 8}print(set1.union(set2)) #(2) {1, 2, 3, 4, 5, 6, 7, 8}
交集--除交集以外的其他元素
print(set1 ^ set2) #(1) {1, 2, 3, 6, 7, 8}print(set1.symmetric_difference(set2)) #(2) {1, 2, 3, 6, 7, 8}
差集--前者獨有的
print(set1 - set2) #(1) {1, 2, 3}print(set1.difference(set2)) #(2) {1, 2, 3}print(set2 - set1) #(1) {8, 6, 7}print(set2.difference(set1)) #(2) {8, 6, 7}
子集與超集
set3 = {1,2,3,4,5}set4 = {1,2,3,4,5,6,7,8}print('------ set3是set4的子集 ------')print(set3 < set4) #Trueprint(set3.issubset(set4)) #Trueprint('------ set4是set3的超集 ------')print(set4 > set3) #Trueprint(set4.issuperset(set3)) #True
五、公共方法
排序
正向排序:sort()
li = [1,5,4,2,6,7,3]li.sort()print(li) #[1, 2, 3, 4, 5, 6, 7]
倒序排序:li.sort(reverse = True)
li = [1,5,4,2,6,7,3]li.sort(reverse = True)print(li) #[7, 6, 5, 4, 3, 2, 1]
反轉:li.reverse()
li = [1,5,4,2,6,7,3]li.reverse()print(li) #[3, 7, 6, 2, 4, 5, 1]
補充:
字元串清單排序——根據字元串的第一個字元對應的ASCII碼排序
li = ['ojhy','asa','cvd','hdk']li.sort()print(li) #['asa', 'cvd', 'hdk', 'ojhy']
count() 數元素出現的次數
li = ['xcsd', 'cdc', '木木',[1, 5, 2], 'eht', '木木']num = li.count('木木')print(num) #2:'木木'出現2次
len() 計算清單的長度
li = ['xcsd', 'cdc', '木木',[1, 5, 2], 'eht', '木木']l = len(li)print(l) #6:清單長度為6
li.index('元素') 檢視索引
li = ['xcsd', 'cdc', '辛辰',[1, 5, 2], 'eht', '辛辰']print(li.index('eht')) #4:'eht'的索引為4元祖
六. 差別與異同

最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、資料分析、資料可視化、機器學習等。想要這些資料的可以關注小編,并在背景私信小編:“01”即可領取。