數(shù)據(jù)結(jié)構(gòu)基本上就是——它們是可以處理一些 數(shù)據(jù) 的 結(jié)構(gòu) 护奈。或者說哥纫,它們是用來存儲一組相關(guān)數(shù)據(jù)的霉旗。
在Python中有四種內(nèi)建的數(shù)據(jù)結(jié)構(gòu)——列表、元組和字典蛀骇,集合厌秒。我們將會學(xué)習(xí)如何使用它們,以及它們?nèi)绾问咕幊套兊煤唵?/p>
如果大家在學(xué)習(xí)中遇到困難擅憔,想找一個python學(xué)習(xí)交流環(huán)境鸵闪,可以加入我們的python圈,裙號947618024暑诸,可領(lǐng)取python學(xué)習(xí)資料岛马,會節(jié)約很多時間,減少很多遇到的難題屠列。
一、列表list
是處理一組有序項目的數(shù)據(jù)結(jié)構(gòu)伞矩,即你可以在一個列表中存儲一個 序列 的項目笛洛。假想你有一個購物列表,上面記載著你要買的東西乃坤,你就容易理解列表了苛让。只不過在你的購物表上,可能每樣?xùn)|西都獨自占有一行湿诊,
而在Python中狱杰,你在每個項目之間用逗號分割。列表中的項目應(yīng)該包括在方括號中厅须,這樣Python就知道你是在指明一個列表仿畸。
一旦你創(chuàng)建了一個列表,你可以添加朗和、刪除或是搜索列表中的項目错沽。由于你可以增加或刪除項目,我們說列表是 可變的 數(shù)據(jù)類型眶拉,即這種類型是可以被改變的
#購物清單shoplist?=?['蘋果','芒果','胡蘿卜','香蕉']
基本操作
print('我有',len(shoplist),'個商品在我的購物清單.')print('它們是:'), # 提示foritem in shoplist:print(item)print('我還買了大米.')?shoplist.append('大米')print('現(xiàn)在我的購物清單是', shoplist)# ['蘋果','芒果','胡蘿卜','香蕉','大米']
基本操作——增
append 追加
li = ['蘋果','芒果','胡蘿卜','香蕉']li.append('大米')print(li)# ['蘋果','芒果','胡蘿卜','香蕉','大米']?li.append(1)# ['蘋果','芒果','胡蘿卜','香蕉','大米',1]?print(li.append('hello'))? #None:無返回值千埃,li.append()只是一個方法、動作?print(li)? # ['蘋果','芒果','胡蘿卜','香蕉','大米',1,'hello']
insert?插入
li = ['蘋果','芒果','胡蘿卜','香蕉']li.insert(3,'草莓')?print(li)? # ['蘋果','芒果','胡蘿卜','草莓','香蕉']
extend?追加到末尾
li = ['蘋果','芒果','胡蘿卜','香蕉']li.extend('cc')print(li)# ['蘋果','芒果','胡蘿卜','香蕉','c','c']?li.extend([1,2,3])print(li)# ['蘋果','芒果','胡蘿卜','香蕉','c','c',123]?li.extend(123) #報錯:數(shù)字不能迭代print(li)? #TypeError:'int'object is not iterable
應(yīng)用實例:
連續(xù)輸入員工姓名忆植,輸入Q/q退出并打印列表
li = []whileTrue:? ? username =input("請輸入要添加的員工姓名:")ifusername.strip().upper() =='Q':breakli.append(username)print(li)print(li)
運(yùn)行結(jié)果:
列表——刪
remove:按照元素刪除
li = ['蘋果','芒果','胡蘿卜','香蕉']li.remove('芒果')print(li)? #? ['蘋果','胡蘿卜','香蕉']
pop:按照索引刪除——有返回值
li = ['蘋果','芒果','胡蘿卜','香蕉']name = li.pop(1)? #有返回值print(name,li)# 芒果 ['蘋果','胡蘿卜','香蕉']?name = li.pop()? #不寫索引則默認(rèn)刪除最后一個print(name,li)# 香蕉 ['蘋果','胡蘿卜']
clear: 清空
li= ['蘋果','芒果','胡蘿卜','香蕉']li.clear()print(li)#[]
del:刪除
li = ['蘋果','芒果','胡蘿卜','香蕉']del li[2:]print(li)# ['蘋果','芒果']?del li? #刪除之后放可,已經(jīng)不存在谒臼,打印報錯print(li) #NameError: name'li'is not defined
循環(huán)刪除
li = [11,22,33,44,55]fori inrange(len(li)):print(i)? ? del li[0]print(li)
列表——改
li[索引]?= ‘被修改的內(nèi)容’
li = ['蘋果','芒果','胡蘿卜','香蕉']li[0] ='火龍果'#將索引為0的位置改為‘火龍果’print(li)# ['火龍果','芒果','胡蘿卜','香蕉']
li[切片]?= ‘被修改的內(nèi)容’(迭代式:分成最小的元素,一個一個添加)
li = ['蘋果','芒果','胡蘿卜','香蕉']li[0:2] ='abcd'# 將索引0-2替換為abcd,切片之后迭代處理?print(li)// ['a','b','c','d','胡蘿卜','香蕉']?li[0:3]=['我','喜歡','吃','水果']print(li)// ['我','喜歡','吃','水果','d','胡蘿卜','香蕉'
列表——查
從頭到尾 :for循環(huán)
li= ['蘋果','芒果','胡蘿卜','香蕉']for i in li:? ? print(i)
某一個:索引
li= ['蘋果','芒果','胡蘿卜','香蕉']print(li[1])#芒果
一段:切片
li = ['蘋果','芒果','胡蘿卜','香蕉']print(li[0:2])? ? #['蘋果','芒果','胡蘿卜']
列表——嵌套
li = ['蘋果', '芒果', '胡蘿卜', ['a','b','c'],'香蕉']print(li[2][1]) #蘿li[3][0].upper() #把列表中第四個元素列表的第一個元素變?yōu)榇髮?print(li)# ['蘋果', '芒果', '胡蘿卜', ['a', 'b', 'c'], '香蕉']
列表——循環(huán)打印
#索引默認(rèn)從零開始li = ['alex','taibai','wusir','egon']foriinli:print(li.index(i),i)#指定索引從100開始for index,i in enumerate(li,100):? ? print(index,i)
運(yùn)行結(jié)果:
其他常用操作
split:字符串轉(zhuǎn)換成列表 str--->list
s='xcsd_cdc_eht_木木'print(s.split('_'))? // ['xcsd','cdc','eht','木木']?s1 ='xc sdc dc eht曾 木木'print(s1.split(' '))? ? // ['xc','sdc','dc','eht曾','木木']
join:列表轉(zhuǎn)換成字符串 list--->str
join(可迭代對象iterable) split
可迭代對象iterable:list,str,元祖
li = ['xcsd','cdc','eht','木木']s =''.join(li)print(s)? #xcsdcdceht木木s1 ='_'.join(li)print(s1)? #xcsd_cdc_eht_木木
range:顧頭不顧尾——相當(dāng)于有序的數(shù)字列表(可以反向耀里,加步長)
fori inrange(2,6):print(i)fori inrange(3):? #從0開始蜈缤,0可省略
應(yīng)用實例:
循環(huán)打印,列表里遇到列表也需要循環(huán)打印
li = [1,2,3,5,'alex',[2,3,4,5,'taibai'],'afds']foriinli:iftype(i) == list:fornini:print(n)else:print(i)
運(yùn)行結(jié)果:
二备韧、元祖
元組和列表十分類似劫樟,只不過元組和字符串一樣是 不可變的 即你不能修改元組。元組通過圓括號中用逗號分割的項目定義织堂。
元組通常用在使語句或用戶定義的函數(shù)能夠安全地采用一組值的時候叠艳,即被使用的元組的值不會改變
tu1 = (1)tu2 = (1,)print(tu1,type(tu1))? ? #1print(tu2,type(tu2))? ? #(1,)
tu3 = ([1])tu4 = ([1],)print(tu3,type(tu3))? ? #[1] print(tu4,type(tu4))? ? #([1],)
元組的基本操作
tu = (1,2,3,'alex','egon')print(tu[2])? ? #3print(tu[0:2])? #(1,2)fori in tu:print(i)? ? #循環(huán)打印元祖
字典
字典類似于你通過聯(lián)系人名字查找地址和聯(lián)系人詳細(xì)情況的地址簿,即易阳,我們把鍵(名字)和值(詳細(xì)情況)聯(lián)系在一起附较。注意,鍵必須是唯一的潦俺,就像如果有兩個人恰巧同名的話拒课,你無法找到正確的信息。
注意事示,你只能使用不可變的對象(比如字符串)來作為字典的鍵早像,但是你可以把不可變或可變的對象作為字典的值。
基本說來就是肖爵,你應(yīng)該只使用簡單的對象作為鍵卢鹦。
鍵值對在字典中以這樣的方式標(biāo)記:d = {key1 : value1, key2 : value2 }。
注意它們的鍵/值對用冒號分割劝堪,而各個對用逗號分割冀自,所有這些都包括在花括號中
dict
key(鍵)必須是不可變數(shù)據(jù)類型,可哈希
value(值)任意數(shù)據(jù)類型
dict 優(yōu)點:二分查找去查詢
存儲大量的關(guān)系型數(shù)據(jù)
特點:<=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 設(shè)置默認(rèn)
# 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. 字典—— 刪
刪除優(yōu)先使用pop(有返回值,要刪除的內(nèi)容不存在時不報錯)芳来,而不是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----可設(shè)置返回值:沒有此鍵/Noneprint(dic1)? ? #沒有此鍵/None? ? {'name':'xc','sex':'female'}
popitem 隨機(jī)刪除
dic1 = {'age':18,'name':'xc','sex':'female'}print(dic1.popitem())? #('sex','female')#隨機(jī)刪除:有返回值-----返回元祖:刪除的鍵值
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----可設(shè)置返回值:沒有此鍵/None
循環(huán)輸出
foriindic1:print(i)? ? #循環(huán)打印鍵(默認(rèn)為鍵)foriindic1.keys():print(i)? ? #循環(huán)打印鍵foriindic1.values():print(i)? ? #循環(huán)打印值foriindic1.items():print(i)? ? #循環(huán)打印鍵值對?fork,vindic1.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變?yōu)榇髮憄rint(dic)?dic['py9']['female'] = 6? ? #找到元祖磨总,增加鍵值對female:6print(dic)
應(yīng)用實例:
#輸入一串字符,遇到字母笼沥,轉(zhuǎn)換為‘_’,并打印輸出
info= input('請輸入:')for i ininfo:? ? if i.isalpha():info=info.replace(i,'_')print(info)
運(yùn)行結(jié)果:
四蚪燕、集合
集合 類似于列表,但每個元素都必須是獨一無二且不可變的:
它是無序的
基本操作
print(set1)? ? #{1,2,3}?set2 = {1,2,3,[2,3],{'name':'xc'}}? #列表是可變的(不可哈希)奔浅,所以出錯print(set2)? ? #TypeError: unhashabletype:'list'
1. 集合——增
add
set1 = {'alex','wusir','ritian','egon','barry'}# (1)add? ? #因為集合是無序的馆纳,所以每次運(yùn)行結(jié)果不一定一樣,增加的位置也不一定一樣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--隨機(jī)刪除
print(set1.pop())? #egon:有返回值鲁驶,返回本次刪除的內(nèi)容?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.集合不能改
集合是無序舞骆;
集合中的元素是不可變數(shù)據(jù)類型
4. 集合——查
set1= {'alex','wusir','ritian','egon','barry'}for i in set1:? ? print(i)
運(yùn)行結(jié)果:
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))? #True?print('------ 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]
反轉(zhuǎn):li.reverse()
li= [1,5,4,2,6,7,3]li.reverse()print(li)#[3, 7, 6, 2, 4, 5, 1]
補(bǔ)充:
字符串列表排序——根據(jù)字符串的第一個字符對應(yīng)的ASCII碼排序
li = ['ojhy','asa','cvd','hdk']li.sort()print(li)? #['asa','cvd','hdk','ojhy']
count() 數(shù)元素出現(xiàn)的次數(shù)
li= ['xcsd','cdc','木木',[1,5,2],'eht','木木']num = li.count('木木')?print(num)#2:'木木'出現(xiàn)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元祖
六. 區(qū)別與異同
列表list元組 tuple集合 set 字典 dict可否讀寫 讀寫 只讀讀寫 讀寫可否重復(fù)是是否是存儲方式值值
鍵
(不能重復(fù))
鍵值對
(鍵不能重復(fù))
是否有序有序有序無序自動正序初始化[1,'a'] ('a', 1)
set([1,2])
或 {1,2}
{'a':1,'b':2}添加 append 只讀 add d['key'] = 'value'讀元素 l[2:] t[0] 無 d['a']
最后多說一句,想學(xué)習(xí)Python可聯(lián)系小編督禽,這里有我自己整理的整套python學(xué)習(xí)資料和路線脆霎,想要這些資料的都可以進(jìn)q裙947618024領(lǐng)取。
本文章素材來源于網(wǎng)絡(luò)狈惫,如有侵權(quán)請聯(lián)系刪除睛蛛。