清空list_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活
List(列表)知識:1年級1班的班級生活
1.1 列表是個啥:List(列表)的基礎(chǔ)知識:
今天我們來講Python六大數(shù)據(jù)類型的第一種:List(列表)。本文將引入一個1年級1班的班級故事,本故事將貫穿教程始末,力求讓每一個小知識點第一次出現(xiàn)在你面前時,都是靈活而可愛的。通過本文的學(xué)習(xí)后,你就能掌握關(guān)于List(列表)的所有相關(guān)知識了。那,跟著我一起看下好不啦?
A.List是啥?
a. List屬于序列:序列共有 List 、 Turple 、 字符串 、 Unicode字符串 、 buffer對象 和 xrange對象 六種,所有序列都存在內(nèi)部的索引(將在后文提及)。
b. List屬于標(biāo)準(zhǔn)數(shù)據(jù)類型:Python標(biāo)準(zhǔn)數(shù)據(jù)類型共有 Number(數(shù)字) 、 String(字符串) 、 List(列表) 、 Turple(元組) 、 Set(集合) 、 Dictionary(字典) 六類。
B.List有啥特征?
我們先來看幾個List(序列)長啥樣:
>>> a = ['Think','123456','[1,2,3]']觀察可以看到:
a. 序列的基本結(jié)構(gòu)為:變量 = [ ] ,即變量 、= 和 []。b. 序列內(nèi)的數(shù)據(jù)類型:不要求一致,可以有多種并存,甚至一個List里面還可以包含其他List。被包含的"子List"此時作為“母List”的元素。c. 序列內(nèi)的元素:序列內(nèi)的內(nèi)容為元素,元素數(shù)目可以為0,即空集 a = [] ;元素之間用 , 分隔開;如果元素為字符串,應(yīng)用 ’ 或者 " 括起來。
C. 序列可以進行的基本操作:最基礎(chǔ)的基本操作一共有五種:索引 、切片、加、乘、 檢查,將在后文中進行詳細解釋。
1.2 可以對列表做啥:List(列表)的操作
a. 創(chuàng)建:1年級1班開學(xué)了!
我們假設(shè)1年級1班開學(xué)了,一共有李布爾、王多魚、蘇大強三名小朋友入學(xué)。我們簡稱1年級1班的班名為one,現(xiàn)在我們要打印出這個班級的同學(xué)名單:
>>> one = ['李布爾','王多魚','蘇大強'] >>> one ['李布爾', '王多魚', '蘇大強']用中括號[ ]創(chuàng)建一個列表賦給one。當(dāng)然班級也可以沒人,比如隔壁1年級2班沒人,list可以是空的:
>>> two = [] >>> two []b. 計數(shù) :班里有幾個人?
這時候老師想知道1年級1班有幾個人,三個人很容易數(shù)出來,可如果想知道全校的人數(shù)呢?需要調(diào)用 len(班級名) 這個語句來計數(shù)列表內(nèi)的元素長度(數(shù)目):
>>> one = ['李布爾','王多魚','蘇大強'] >>> len(one) 3
注意:空list也可以用len,空list長度為0。比如我們看看慘淡的1年級2班:
>>> two = [] >>> len(two) 0c. 訪問元素:班里都是按學(xué)號點名的!
在學(xué)校里,每名同學(xué)都有自己的學(xué)號,這就是列表中的元素索引。
學(xué)號的制定規(guī)律:
1.在一個有人的班級中,每名同學(xué)都有兩個學(xué)號(即索引),這個學(xué)號是以他們在整個班級中的相對位置確定的。
2.正數(shù)第一位學(xué)號為0,正數(shù)第二位學(xué)號為1…倒數(shù)第一位學(xué)號為-1,倒數(shù)第二位學(xué)號為-2。即:正數(shù)索引為n-1,倒數(shù)索引為-n。
比如以1年級1班為例:
>>> one = ['李布爾','王多魚','蘇大強']王多魚是正數(shù)第一位同學(xué)、倒數(shù)第三位同學(xué)。所以他的學(xué)號就有0和-3兩個。
當(dāng)老師想點名的時候,要用班級名[學(xué)號]的方式點學(xué)號。例如點二號同學(xué):
>>> one = ['李布爾','王多魚','蘇大強'] >>> one[2] '蘇大強'如果老師想知道某個同學(xué)的姓氏怎么辦?對于列表內(nèi)的元素我們還可以繼續(xù)切割:
>>> one = ['李布爾','王多魚','蘇大強'] # 查看 1年級1班 學(xué)號為 0 的同學(xué)姓名: >>> name = one[0] # 取該姓名索引為0的字符: >>> name [0] '李'如果老師想叫多位同學(xué),比如想叫從1號開始后面的所有同學(xué)呢?
>>> one = ['李布爾','王多魚','蘇大強'] >>> one[1:] ['王多魚', '蘇大強']我們可以看到,就成功把1號和2號同學(xué)叫出來了。這里用的是切片的方式,即班級名[從第幾號學(xué)生開始:截止到第幾號學(xué)生之前],從第n號開始的全部可以用班級名 [n:],截止到n號之前的全部可以用班級名[:n]。
d. 追加元素 :1年級1班的新生
班里轉(zhuǎn)來了一名新生,叫史曉明。我們用班級名.append(新同學(xué)名字) 的方式將他添到班級名單里,按照先來后到的規(guī)則,他自然排在最后:
第一種情況:默認添加新元素到列表末尾
>>> one = ['李布爾','王多魚','蘇大強'] >>> one.append('史曉明') >>> one ['李布爾', '王多魚', '蘇大強', '史曉明']這時候‘王多魚’ 小朋友家財大氣粗的派來一名隨讀保鏢,強烈要求學(xué)號和王多魚挨著。那能不能安排到指定位置呢?當(dāng)然可以,我們可以使用班級名.insert(保鏢學(xué)號,‘保鏢名字’) 的方式將其添加到指定位置:
第二種情況:指定位置插入元素
>>> one = ['李布爾', '王多魚', '蘇大強', '史曉明'] >>> one.insert(2,'錢大彪') >>> one ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']這時候需要注意,因為‘錢大彪’的加入,導(dǎo)致列表內(nèi)新元素后面元素的相對位置都發(fā)生了一次變化。例如 ‘蘇大強’ 過去學(xué)號是 2 和 -2,現(xiàn)在學(xué)號則變成了3和 -2。
e.刪除:報告老師,我想退學(xué)!
因為剛才 ‘錢大彪’ 的加入,導(dǎo)致 ‘蘇大強’ 和 ‘史曉明’ 的學(xué)號都滯后一名。在調(diào)和失敗后, ‘史曉明’同學(xué)憤而退學(xué),老師只好將其從班級名單中刪掉。在python中,將元素從列表中刪除一共有三種方式:
第一種刪除方式:remove 語句
班主任拿出了班級名單,找到了‘史曉明’ 的名字,然后用 班級名.remove(史曉明的姓名) 的方式將 ‘史曉明’ 在班級名單中刪除了:
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明'] >>> one.remove('史曉明') >>> one['李布爾', '王多魚', '錢大彪', '蘇大強']第二種刪除方式:del 語句
第一種用remove 語句刪除的情況,前提是老師記得 ‘史曉明’ 的名字。但萬一老師不知道這個學(xué)生的名字,或者有熊孩子沒事改名字記不住咋辦?沒事,我們還可以用他的學(xué)號刪除(索引刪除),方法為:del 班級名[史曉明學(xué)號] 。
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明'] >>> del one[4] >>> one ['李布爾', '王多魚', '錢大彪', '蘇大強']第三種刪除方式:pop 語句
我們用學(xué)號刪除的時候容易出問題,萬一刪錯了咋辦?我咋知道哪個索引到底還是不是 ‘史曉明’ 的學(xué)號?。這時候我們可以用pop 語句,同樣也是用索引刪除,但是pop刪除元素后會給你顯示刪除學(xué)號對應(yīng)的名字。具體方法為: 班級名.pop(史曉明的學(xué)號)
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明'] >>> one.pop(4) '史曉明' >>> one ['李布爾', '王多魚', '錢大彪', '蘇大強']我們可以看到執(zhí)行了班級名.pop(史曉明學(xué)號) 后,先給我們返回了一個 ‘史曉明’ 的值,告訴我們剛才刪的是啥。我們在執(zhí)行一下 one,就會看到班級名單里已經(jīng)刪除了。
注意:當(dāng)我們需要刪除列表中的最后一個元素時,可以不寫元素索引。像在剛才的例子中,用 班級名.pop() 即可刪除位于班級名單最后的 ‘史曉明’ 同學(xué):
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明'] >>> one.pop() '史曉明' >>> one ['李布爾', '王多魚', '錢大彪', '蘇大強']講完班級名.remove()、del 班級名[] 和 班級名.pop() 后,不得不將另一種刪除元素的語句。這種語句與上述三種的不同在于,它會刪除元素內(nèi)所有元素:
第四種刪除方式:list.clear() 語句
這種方式為清空列表內(nèi)所有元素,將該列表變?yōu)榭誰ist:
>>> a = ('1','2','3') >>> a.clear() >>> a []這時候如果我們想再確認一遍 ‘史曉明’ 同學(xué)到底還在不在班級名單里,可以使用 in 語句,方法為要檢查的同學(xué)名字 in 班級名 :
>>> one = ['李布爾','王多魚','錢大彪','蘇大強'] >>> '史曉明' in oneFalse返回的結(jié)果是 False,就說明史曉明已經(jīng)不在班級名單中了。同樣我們也可以用要檢查的元素 not in 序列來判斷元素是否不再序列中:
>>> one = ['李布爾','王多魚','錢大彪','蘇大強'] >>> '史曉明' not in one True這里要注意的是在要檢查的元素 not in 序列 和 要檢查的元素 in 序列 中,in 后面的既可以是 變量 也可以是 序列本身 ,例如:
# 在變量中檢索 >>> one = ['李布爾','王多魚','錢大彪','蘇大強'] >>> '史曉明' in one False # 在序列中檢索>>> one = ['李布爾','王多魚','錢大彪','蘇大強'] >>> '史曉明' in ['李布爾','王多魚','錢大彪','蘇大強'] False確定將 ‘史曉明’ 從班級中刪除后,班主任想點一遍名。for in 循環(huán)語句終于出場了,用法為 for 標(biāo)識符 in 序列 。執(zhí)行語句后,Python會將 列表 中每一個 元素賦值給標(biāo)識符,賦值結(jié)束后繼續(xù)循環(huán)將第二個元素再重新賦值給標(biāo)識符,直到將列表中所有數(shù)據(jù)賦過一遍結(jié)束。
>>> one = ['李布爾','王多魚','錢大彪','蘇大強'] >>> for i in one: print(i) 李布爾 王多魚 錢大彪 蘇大強在上述代碼中,即將序列 one 中的每一個元素依次賦給標(biāo)識符 i,即可理解為依次執(zhí)行:i1 = ‘李布爾’、i2 = ‘王多魚’、i3 = ‘錢大彪’、i4 = ‘蘇大強’,然后print(i) 即依次打印之前的每一次i值,即依次執(zhí)行print(i1)、print(i2)、print(i3)和 print(i4)。
**f. 更新與替換:王多魚改名了
換名的情況還是發(fā)生了:有一天 ‘王多魚’ 的家長聯(lián)系老師,請老師更新一下班級名單,因為王多魚剛剛改名了。老師問為啥?他說覺得 ‘王多魚’ 這個名字太世俗了,要取一個有文化的名字: ‘王有才’ 。
老師雖是無奈,也只好作罷。用 班級名[王多魚的學(xué)號] = 王多魚的新名字 的方式將班級名單中,王多魚的姓名記錄更新了,從此以后王多魚叫王有才:
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強'] >>> one[1] = '王有才' >>> one ['李布爾', '王有才', '錢大彪', '蘇大強']**g.合并班級
后來教務(wù)處做出一個決定,將1年級3班并入1年級1班。忙碌的班主任又要開始重新合并班級名單,我們先來看一下1年級3班的新同學(xué)們:
>>> three = ['楊九年','周媛','錢大彪','鄭仕'](好像有個哥們重名了??我們一會再說)
班主任這時調(diào)用了 extend 語句合并兩個班的學(xué)生,方法為 1班名字.extend(3班名字)
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強'] >>> three = ['楊九年','周媛','錢大彪','鄭仕'] >>> one.extend(three) >>> one ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']還是按照先來后到的道理:extend里新加入列表內(nèi)的所有元素,都默認添加到了源列表的末尾。
初次之外還可以用 列表直接相加 的方式,例如:
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強'] >>> three = ['楊九年','周媛','錢大彪','鄭仕'] >>> one = one + three >>> one ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']說到列表之間相互相加,我們再順便談?wù)劻斜淼某朔āR粋€列表可以直接乘以一個數(shù)字,我們可以看看會得到什么樣的結(jié)果:
>>> a = ['think','pad'] >>> a * 3 ['think', 'pad', 'think', 'pad', 'think', 'pad']我們發(fā)現(xiàn):將列表乘以一個整數(shù)后,Python會將列表內(nèi)所有元素按順序重復(fù)輸出相應(yīng)的次數(shù)。
另外我們發(fā)現(xiàn),1年級1班和1年級3班都有1名叫 ‘錢大彪’ 的同學(xué),但是都不受影響的就放到了同一個列表中。我們可得知:列表中的元素是可重復(fù)的。
如果有重復(fù),我們咋知道重復(fù)了幾次呢?這時候我們可以用 ‘count’ 語句,用法為 班級名.count(像檢查重復(fù)數(shù)的對象) :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕'] >>> one.count('錢大彪') 2我們就知道,班里現(xiàn)在有兩個 ‘錢大彪’ 的人了,我們可以按照學(xué)號次序管他們叫 ‘大錢大彪’ 和 ‘小錢大彪’,我們想查 ‘大錢大彪’ 的學(xué)號時,可以用 班級名.index(搜索條件) 的方式檢索第一個匹配搜索的同學(xué)的學(xué)號(序列):
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕'] >>> one.index('錢大彪') 2這時候我們就可以快速知道,‘大錢大彪’ 的學(xué)號是 2 了。
**h. 排序與嵌套:1年級1班要分組了
為了班級合并后的有序管理,教務(wù)處給了1年級1班的班主任一個這樣的任務(wù):
要選出一名班長。班長以外的七名同學(xué)分成兩組,每組一名隊長三名隊員。
以學(xué)籍號正序為準(zhǔn),前三位分別為:班長、兩名隊員。
將班長名單、隊長名單、隊員名單提交至教務(wù)處,收到回復(fù)。
第一步:選出學(xué)籍號排名第一的同學(xué)為班長
一開始我們說每個都學(xué)都有自己的學(xué)號(索引),但是這容易出現(xiàn)這樣一個問題:
在1年級1班里,學(xué)號為 0 的是 ‘李布爾’ 小朋友,但 ‘楊九年’ 小朋友在3年級1班的時候?qū)W號也是 0 。為了避免這種重新排序,我們要了解 學(xué)籍號 (id)這個概念,每個小朋友都有自己獨一無二id,我們可以用 id(查看id的對象) 這個語句來查看:
首先要按照學(xué)籍號選出班長來。班主任在這時候調(diào)用了 min 語句,使用方法為 min(班級名):
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕'] >>> min(one) '周媛'這時,姓名首字母排名最小的 ‘周媛’ 同學(xué)成為了班長。
順便一提:我們看到 min 語句自然而然就能想到 max 語句,使用方法為 max() 語句。
max 和 min 語句其實可以設(shè)定排序條件的,方法為 min(班級名,key=排序方式) ,比如我們想看看1年級1班中誰名字最短,就可以用 len 即長度來作為判斷標(biāo)準(zhǔn) min(班級名,key=len) :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕'] >>> min(one,key=len) '周媛'我們會發(fā)現(xiàn)在班里 ‘周媛’ 和 ‘鄭仕’ 都是兩個字,但是執(zhí)行后卻給了我們 ‘周媛’ 的名字,原因是: min 或者 max 語句默認將符合條件的第一個作為結(jié)果返回。
第二步:按學(xué)籍號排名先后分出隊長和隊員
要分出隊長和隊員,首先我們要知道1年級1班同學(xué)們學(xué)籍號由小到大的排序吧,班主任用了 sort 語句給班內(nèi)人排序,使用方法為 班級名.sort() :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕'] >>> one.sort() >>> one ['周媛', '李布爾', '楊九年', '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']現(xiàn)在就一目了然了: 次序第一位的‘周媛’為班長、次序第二、三位的 ‘李布爾’ 、 ‘楊九年’為隊長, 其余五人各為兩組隊員。
注意:在sort() 函數(shù)中會默認地按升序排列
說到用 sort() 語句可以將一個列表正向排列,就不得不提到可以將列表倒敘排列的 reverse 語句:
>>> one = ['周媛', '李布爾', '楊九年', '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪'] >>> one.reverse() >>> one ['錢大彪', '錢大彪', '鄭仕', '蘇大強', '王有才', '楊九年', '李布爾', '周媛']這時候老師可以創(chuàng)建班長、隊長、隊員的三個名單了:
>>> monitor = ['周媛'] >>> captain = ['李布爾','楊九年' ] >>> member = [ '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']但是這樣分三行顯示好像不太方便,機智的班主任使用了將 monitor 、 captain 和 member 合并給了一個新的班級名單:
>>> monitor = '周媛' >>> captain = ['李布爾','楊九年' ] >>> member = [ '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪'] >>> one = [monitor, captain, member] >>> one ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]班主任完成了1年級1班開學(xué)以來的第一個重要任務(wù),心滿意足的給教務(wù)處交了差。
通過上述我們可以觀察得知:list(列表)內(nèi)還可以嵌套其他列表,但其他“列表”被嵌套進來后就已經(jīng)成為了元素,我們可以檢驗一下:
>>> one = ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']] >>> len(one) 3此時再用 len(班級名) 檢驗發(fā)現(xiàn),one 下只有三個元素。
**i. 復(fù)制:教務(wù)主任想把這次的名單備個份
教務(wù)主任想把這次1年級1班提交的班級名單拷貝一份,留在他的備份 Beifen 里,開始糾結(jié)起來了:列表(list)的備份方式有直接賦值 、淺拷貝 和 深拷貝三種,這種情況下用哪種好呢?都試試吧!
**第一種拷貝:直接賦值
一開始教務(wù)主任想偷偷懶,直接把1年級1班提交的 one 列表賦值給我的備份文件 Beifen 不就好了 :
>>> one = ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']] >>> Beifei = one >>> Beifei ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]完美!可是直到有一天,教導(dǎo)主任發(fā)現(xiàn)他辦公室里的那份 Beifen 文件里,怎么‘楊九天’ 自己變成了 ‘楊浩天’ ?他去問1年級1班的班主任,班主任告訴他:
楊九天改名了,我就把我手里的班級名單改了,怎么,您那兒的列表也變了?
是的,也改變了:
>>> captain[1] = '楊浩天' >>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']] >>> Beifei [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]教務(wù)主任想:這不靠譜啊,這樣我辦公室文件就可以讓提交人隨便改了!
于是教導(dǎo)主任只能開始嘗試第二種:
**第二種拷貝:淺拷貝
淺拷貝的使用方式主要有 拷貝到的地方 = 源列表.copy() 、 拷貝到的地方 = 源列表[:] 、 拷貝到的地方 = list(源列表) 效果相同的三種,教導(dǎo)主任就以第一種為例試一下:
>>> Beifei = one.copy() >>> Beifei [['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]好像看起來又成功了,但教導(dǎo)主任不死心。讓班主任再改一下他手里的班級文件,看看自己這里會不會變:
>>> captain[1] = '楊浩天' >>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']] >>> Beifei[['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]還是會變! 教導(dǎo)主任又放棄了第二種拷貝方式,將希望放在了最后一種上:
**第三種拷貝:深拷貝
深拷貝和剛才兩種都不一樣,使用深拷貝前需要先用 import 語句將 copy 調(diào)用出來,方法為 import copy。調(diào)用后,深拷貝的使用方法為 拷貝到的地方 = copy.deepcopy(源列表):
>>> import copy >>> Beifei = copy.deepcopy(one) >>> Beifei [['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]失敗了兩次的教務(wù)主任這時候已經(jīng)不信結(jié)果了,執(zhí)意要班主任再在他那改一次名字:
>>> captain[1]= '楊浩天' >>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']] >>> Beifei [['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]成功了!這時候我們就明白了:在深拷貝中,當(dāng)改變原序列中二層以及二層以下的內(nèi)容時,拷貝后的內(nèi)容不會受到任何影響。而直接賦值和淺拷貝的方式會受影響。
啥叫二層?
#這叫只有一層: first = [] #這叫二層,存在列表嵌套: second = [[],[]]到這里,我們關(guān)于list(列表)的敘述就告一段落。
總結(jié)
以上是生活随笔為你收集整理的清空list_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝色三角_梅山!长三角唯一近海蓝色海湾成
- 下一篇: python中关键字 表示空类型_Pyt